我试图弄清楚下面的代码有什么问题。我认为使用 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/

10-12 12:49