我试图弄清楚下面的代码有什么问题。我认为使用 async 和 await 让我忘记了 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
中。
代码可能正在做的是一些受 CPU 限制或阻塞的操作。
如果你想在后台线程上运行一些受 CPU 限制的代码,你必须明确地这样做; async
不会自动跳转线程:
int result = await Task.Run(() => longRunningMethod());
请注意,如果
longRunningMethod
受 CPU 限制,则它应该具有同步(而非异步)签名。如果
longRunningMethod
不受 CPU 限制(即,它当前处于阻塞状态),那么您需要将 longRunningMethod
中的阻塞方法调用更改为异步,并通过 await
调用它们。然后你可以使 longRunningMethod
异步并通过 await
调用它:int result = await longRunningMethodAsync();
关于c# - 使用 async/await 时 GUI 卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33671919/