c#在异步方法中阻塞代码

时间:2016-03-21 09:08:00

标签: c# asynchronous async-await win-universal-app

我在Windows 10(UWP)应用程序中使用MvvmCross和AsyncEx库。

在ViewModel中,我有一个INotifyTaskCompletion属性(1),它连接到ViewModel(2)中的Async方法

在(2)中,我调用了一个Async库方法:

  • 检查本地缓存
  • 异步下载数据
  • 将数据添加到缓存

缓存代码不能异步,因此库方法包含阻塞代码和异步代码。

Q值。什么是阻止阻止UI线程的最佳方法?

我从Stephen Cleary了解到不要在异步代码中阻塞而不在库方法中使用Task.Run。所以我必须......。

将缓存调用移动到(2)例如

  • 使用Task.Run(检查缓存)
  • 异步调用库方法
  • 再次使用Task.Run(缓存数据)?

有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

如果你有完全同步的代码,你可以改变它以使其返回等待,并希望使其异步,那么是的,如果你想使用async/await,你唯一的选择就是使用Task.Run()

类似的东西:

public async Task<T> MyMethod()
{
   T result = await Task.Run(() => CheckCacheOnSyncMethodICantChange());
   if(result != null)
   {
     result = await MyLibraryMethodThatReturnsATask();
     await Task.Run(() => AddToCacheOnSyncMethodICantChange(result));
   }
   return result;
}

应该没问题。