我试图弄清楚下面的代码有什么问题。我认为使用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
。为什么这段代码会冻结我的应用程序?
答案 0 :(得分:7)
问题出在longRunningMethod
。
可能做的代码是一些CPU绑定或阻塞操作。
如果要在后台线程上运行一些CPU绑定代码,则必须明确地执行此操作; async
不会自动跳转线程:
int result = await Task.Run(() => longRunningMethod());
请注意,如果longRunningMethod
受CPU限制,它应该具有同步 - 非异步 - 签名。
如果longRunningMethod
不受CPU限制(即,它当前正在阻止),那么您需要将longRunningMethod
内的阻止方法调用更改为异步,并通过await
调用它们。然后,您可以使longRunningMethod
异步,并通过await
调用它:
int result = await longRunningMethodAsync();