使用async / await时,GUI会冻结

时间:2015-11-12 12:55:43

标签: c# wpf async-await

我试图弄清楚下面的代码有什么问题。我认为使用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。为什么这段代码会冻结我的应用程序?

1 个答案:

答案 0 :(得分:7)

问题出在longRunningMethod

可能做的代码是一些CPU绑定或阻塞操作。

如果要在后台线程上运行一些CPU绑定代码,则必须明确地执行此操作; async不会自动跳转线程:

int result = await Task.Run(() => longRunningMethod());

请注意,如果longRunningMethod受CPU限制,它应该具有同步 - 非异步 - 签名。

如果longRunningMethod 受CPU限制(即,它当前正在阻止),那么您需要将longRunningMethod内的阻止方法调用更改为异步,并通过await调用它们。然后,您可以使longRunningMethod异步,并通过await调用它:

int result = await longRunningMethodAsync();