Tag: async await

通用FromEvent方法

使用新的async / await模型,生成一个在事件触发时完成的Task非常简单; 你只需要遵循这种模式: public class MyClass { public event Action OnCompletion; } public static Task FromEvent(MyClass obj) { TaskCompletionSource tcs = new TaskCompletionSource(); obj.OnCompletion += () => { tcs.SetResult(null); }; return tcs.Task; } 这允许: await FromEvent(new MyClass()); 问题是您需要为每个要await类中的每个事件创建一个新的FromEvent方法。 这可能会变得非常快,而且它主要只是样板代码。 理想情况下,我希望能够做到这样的事情: await FromEvent(new MyClass().OnCompletion); 然后我可以为任何实例上的任何事件重用相同的FromEvent方法。 我花了一些时间来尝试创建这样的方法,并且存在许多障碍。 对于上面的代码,它将生成以下错误: 事件’Namespace.MyClass.OnCompletion’只能出现在+ =或 – =的左侧 据我所知,没有办法通过代码传递这样的事件。 所以,下一个最好的事情似乎是尝试将事件名称作为字符串传递: await FromEvent(new […]

下载多个文件异步并等待所有文件完成后再执行其余代码

我试图从互联网上下载多个文件,等待所有这些文件完成。 这是我正在运行的C#控制台应用程序,因此不需要进度条事件处理程序。 但是,即使尚未下载所有文件,它目前仍继续执行代码。 1.下载所有文件! 2.完成下载文件A. 3.Finished下载所有文件! 4.Finished下载文件B. 5.Finished下载文件C. 您将如何等待所有异步下载文件完成。 private void DownloadMultipleFiles(List doclist) { foreach(var value in doclist){ try { using (WebClient webClient = new WebClient()) { string downloadToDirectory = @Resources.defaultDirectory + value.docName; webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; webClient.DownloadFileCompleted += client_DownloadFileCompleted; webClient.DownloadFileAsync(new Uri(value.docUrl), @downloadToDirectory); //Add them to the local Context.listOfLocalDirectories.Add(downloadToDirectory); } } catch (Exception) { Errors.printError(“Failed to […]

不允许异步锁定

基本上,我想向tcp服务器发出多个异步请求。 我目前有一个只有同步的工作客户端,并在每次网络调用时阻止UI。 由于多个请求几乎可能同时发生,我尝试这样做: private object readonly readLock = new object(); public async Task UpdateDetailsAsync() { //I want every request to wait their turn before requesting (using the connection) //to prevent a read call from catching any data from another request lock (readLock) { Details details = await connection.GetDetailsAsync(); detailsListBox.Items = details; } } 我确信这不是一个很好用的锁,但这是我能想到的唯一方法,可以让电话等待轮到他们。 有没有我可以用来实现这种行为的对象? […]

await Task 和Task .Result有什么区别?

public async Task GetName(int id) { Task nameTask = Task.Factory.StartNew(() => { return string.Format(“Name matching id {0} = Developer”, id); }); return nameTask.Result; } 在上面的方法return语句我使用Task.Result属性。 public async Task GetName(int id) { Task nameTask = Task.Factory.StartNew(() => { return string.Format(“Name matching id {0} = Developer”, id); }); return await nameTask; } 我在这里使用等待任务。 如果我认为await将释放调用线程但是Task.Result将阻止它,我会不会错,它会是正确的吗?

什么是ThreadPool服务器的async / await等价物?

我正在使用同步apis和线程池的tcp服务器看起来像这样: TcpListener listener; void Serve(){ while(true){ var client = listener.AcceptTcpClient(); ThreadPool.QueueUserWorkItem(this.HandleConnection, client); //Or alternatively new Thread(HandleConnection).Start(client) } } 假设我的目标是在资源使用率最低的情况下处理尽可能多的并发连接,这似乎很快就会受到可用线程数量的限制。 我怀疑通过使用非阻塞任务apis,我将能够用更少的资源处理更多。 我最初的印象是这样的: async Task Serve(){ while(true){ var client = await listener.AcceptTcpClientAsync(); HandleConnectionAsync(client); //fire and forget? } } 但令我印象深刻的是,这可能会导致瓶颈。 也许HandleConnectionAsync需要花费非常长的时间才能达到第一个await,并且会阻止主接受循环继续进行。 这只会使用一个线程,还是运行时会在多个线程上神奇地运行它看起来合适的东西? 有没有办法将这两种方法结合起来,这样我的服务器就可以使用它所需的线程数来满足正在运行的任务的数量,但是它不会在IO操作上不必要地阻塞线程? 在这种情况下,是否存在最大化吞吐量的惯用方法?