我试图找出下面的代码有什么问题。我认为使用 async 和 wait 让我忘记 GUI 问题,例如冻结,因为一些长代码阻塞了主线程。
单击按钮后,GUI 会做出响应,直到调用longRunningMethod
, 如下所示:
private async void openButton_Click(object sender, RoutedEventArgs e)
{
//doing some usual stuff before calling downloadFiles
Task<int> result = await longRunningMethod(); // async method
//at this point GUI becomes unresponsive
//I'm using the result here, so I can't proceed until the longRunningMethod finishes
}
在该方法完成之前我无法继续,因为我需要result
。为什么此代码会冻结我的应用程序?
问题出在内longRunningMethod
.
代码是什么probably所做的是一些 CPU 密集型或阻塞操作。
如果你想在后台线程上运行一些 CPU 密集型代码,你必须明确地这样做;async
不会自动跳转线程:
int result = await Task.Run(() => longRunningMethod());
请注意,如果longRunningMethod
受 CPU 限制,它应该具有同步(而不是异步)签名。
If longRunningMethod
is notCPU 限制(即当前处于阻塞状态),那么您需要更改其中的阻塞方法调用longRunningMethod
是异步的,并通过调用它们await
。然后你可以使longRunningMethod
异步并通过调用它await
还有:
int result = await longRunningMethodAsync();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)