加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用async / await时GUI冻结

发布时间:2020-12-15 23:28:53 所属栏目:百科 来源:网络整理
导读:我想弄清楚下面的代码有什么问题.我认为使用async和await让我忘记了诸如冻结之类的GUI问题,因为一些长代码阻塞了主线程. 单击按钮后,GUI响应,直到调用longRunningMethod,如下所示: private async void openButton_Click(object sender,RoutedEventArgs e) {
我想弄清楚下面的代码有什么问题.我认为使用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

  }

在方法完成之前我无法继续,因为我需要结果.为什么这段代码会冻结我的应用?

解决方法

问题出在longRunningMethod中.

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

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

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

请注意,如果longRunningMethod是CPU绑定的,它应该具有同步 – 非异步 – 签名.

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

int result = await longRunningMethodAsync();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读