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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |