我正在学习asynchronous/等待,并遇到了需要同步调用asynchronous方法的情况。 我怎样才能做到这一点? asynchronous方法: public async Task<Customers> GetCustomers() { return await Service.GetCustomersAsync(); } 正常用法: public async void GetCustomers() { customerList = await GetCustomers(); } 我已经尝试使用以下内容: Task<Customer> task = GetCustomers(); task.Wait() Task<Customer> task = GetCustomers(); task.RunSynchronously(); Task<Customer> task = GetCustomers(); while(task.Status != TaskStatus.RanToCompletion) 我也从这里尝试了一个build议,但是当调度员处于暂停状态时它不起作用。 public static void WaitWithPumping(this Task task) { if (task == null) throw new […]
我碰到一些使用c#的async / await关键字进行异步编程的最佳实践(我是c#5.0的新手)。 其中一个建议是: 稳定性:了解您的同步上下文 …一些同步上下文是不可重入和单线程的。 这意味着在给定的时间只能在上下文中执行一个工作单元。 这个例子是Windows UI线程或ASP.NET请求上下文。 在这些单线程的同步上下文中,自己很容易死锁。 如果你从一个单线程上下文中产生一个任务,那么等待上下文中的任务,你的等待代码可能会阻塞后台任务。 public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // a very simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); } 如果我自己尝试剖析它,主线程会在“MyWebService.GetDataAsync();”中生成一个新线程,但是由于主线程在那里等待,它将等待“GetDataAsync()。Result”的结果。 同时,说数据已经准备好了。 为什么主线程不继续它的继续逻辑,并从GetDataAsync()返回字符串结果? 有人可以解释一下为什么在上面的例子中有一个僵局? 我完全不知道问题是什么