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

How*_*ard 5 c# asynchronous async-await win-universal-app

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

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

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

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

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

问:防止阻止UI线程的最佳方法是什么?

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

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

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

有没有更好的办法?

Jcl*_*Jcl 5

如果您拥有完全同步的代码,并且无法更改以使其返回等待状态,并且希望使其异步,那么可以,您唯一要使用的选择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;
}
Run Code Online (Sandbox Code Playgroud)

应该可以。