gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:13:22 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

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

有没有更好的办法?

最佳答案

如果你有完全同步的代码,你不能改变它来让它返回一个等待对象,并且想让它异步,那么是的,如果你想使用 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;
}

应该没问题。

关于c# 异步方法中的阻塞代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36126783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com