Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止UI在使用Task.Result时冻结

防止UI在使用Task.Result时冻结
EN

Stack Overflow用户
提问于 2018-11-15 21:37:52
回答 1查看 2.5K关注 0票数 0

我正在调用Task.Run(() => DoSomething()).Result,这会导致UI冻结,这是因为我使用了".Result“。我需要结果,因为我想返回值。

我不希望方法StartSomething是异步的,因为我不想等待方法StartSomething。我希望等待发生在DoSomething()上。

因此,基本上,我需要一个异步方法来被同步方法调用,而不冻结UI。另外,我希望将异步方法的值返回到Button Click上的顶层。

该代码可以改进吗?还是有其他解决方案?

代码语言:javascript
运行
AI代码解释
复制
private TaskCompletionSource<bool> TaskCompletion = null;
private void Button_Click(object sender, RoutedEventArgs e)
    {
        bool k = StartSomething();
    }

    private bool StartSomething()
    {
        return Task.Run(() => DoSomething()).Result;
    }

    private async Task<bool> DoSomething()
    {
        TaskCompletion = new TaskCompletionSource<bool>();
        await Task.WhenAny(TaskCompletion.Task, Task.Delay(3000));
        MessageBox.Show("DoSomething");
        return true;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-16 02:31:29

方法StartSomething()对我来说没有意义。它启动一个新的Task,然后同步地等待这个任务的结果(.Result),这实际上是无用的-它几乎是*,就像直接调用DoSomething()一样。而且,DoSomething()已经是异步的,所以您不需要为此启动一个新的Task

看起来您根本不需要StartSomething()方法。如果您使Button_Click处理程序async,那么您可以直接await DoSomething()

代码语言:javascript
运行
AI代码解释
复制
private TaskCompletionSource<bool> TaskCompletion = null;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    bool k = await DoSomething();
}

private async Task<bool> DoSomething()
{
    TaskCompletion = new TaskCompletionSource<bool>();
    await Task.WhenAny(TaskCompletion.Task, Task.Delay(3000));
    MessageBox.Show("DoSomething");
    return true;
}

编辑:

虽然使用异步一直向下的解决方案(如上面所示)是IMO的首选方法,但是如果您真的不能将调用代码更改为async,我可以想到两种方法从同步方法调用async方法而不阻塞UI。首先是手动设置一个连续任务,如下所示:

代码语言:javascript
运行
AI代码解释
复制
private void Button_Click(object sender, RoutedEventArgs e)
{
    DoSomething().ContinueWith((task) =>
        {
            bool k = task.Result;

            // use the result
        },

        // TaskScheduler argument is needed only if the continuation task
        // must run on the UI thread (eg. because it access UI elements).
        // Otherwise this argument can be omitted.
        TaskScheduler.FromCurrentSynchronizationContext());

    // Method can exit before DoSomething().Result becomes
    // available, which keep UI responsive
}

因此,您可以基本地将同步方法(一个拆分,而不是每个await)拆分成由.ContinueWith链接的几个部分(延续、lambda方法)。这类似于await在引擎盖下所做的工作。问题是,与await不同(它生成漂亮而干净的代码),您的代码将满是这些连续的lambda。当您添加异常处理块、using块等时,情况会变得更糟。

第二种方法是使用嵌套循环,例如。Stephen的WaitWithNestedMessageLoop扩展方法:

代码语言:javascript
运行
AI代码解释
复制
static T WaitWithNestedMessageLoop<T>(this Task<T> task)
{
    var nested = new DispatcherFrame();
    task.ContinueWith(_ => nested.Continue = false, TaskScheduler.Default);
    Dispatcher.PushFrame(nested);
    return task.Result;
}

嵌套循环是非常高级的技术(实际上我从未使用过它),除非您必须使用它,否则我不建议使用它。

*在异常处理、执行线程等方面存在差异,但这些与此问题无关。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53332038

复制
相关文章
你真的会用Chrome吗?
最近一个大神推荐我一个网站,才知道chrome还有各种骚姿势。这个网站是:umaar.com/dev-tips/,本文分享一些实用且聪明的调试技巧。
我被狗咬了
2019/11/12
3670
你真的会用Chrome吗?
这些好用的 Chrome 扩展,你值得拥有!
使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的。
昱良
2019/05/07
5930
这些好用的 Chrome 扩展,你值得拥有!
你要的 Chrome 扩展都在这里
在狗哥这个程序员的世界里,只有谷歌浏览器和其他浏览器。说到谷歌浏览器相信大家都很熟悉,如果你还在使用其他浏览器,墙裂建议你换成 Chrome 也就是谷歌浏览器。它的强大无疑得益于它支持的各种扩展,比如狗哥的 Chrome 就装有过滤网页广告的插件,所以,我追剧即使没会员,也从来不需要看广告,简直不要太爽。
JavaFish
2019/10/17
2.1K0
你要的 Chrome 扩展都在这里
在DataGrid中创建一个弹出式Details窗口
在DataGrid中创建一个弹出式Details窗口 这篇文章来自DotNetJunkie的提议。他最初写信要求我们提供一个关于如何创建在DataGrid 中使用HyperLinkColumn的例子,可以在用户点击这一列后打开一个新窗口,显示出此列的详细内容。在此之前我们曾经通过email回答他们,他建议我们将这个方法加入他们的指南中,于是,就有了这篇文章。像我们原来的文章一样,它很简单,但是简单的包含代码的方法例可以更有效地启发开发者。 这个例子包含两个WebForms和一个css文件(所有的代码都可
阿新
2018/04/13
2.5K0
Chrome下的打开新窗口
做了一个后台运维管理系统<前台页面基于Extjs进行开发>,在点击datagrid头部一个按钮,需要打开一个新窗口
meteoric
2018/11/15
3.8K0
那些实用的 Chrome 扩展神器
之前已经写过不少Chrome扩展那些我常用的 Chrome 扩展,这里继续推荐那些实用Chrome扩展 ,所谓实用就是能解决实际问题。
数据森麟
2019/12/31
1.2K0
那些实用的 Chrome 扩展神器
chrome扩展推荐-Tampermonkey
  得益于Google的品牌力量和技术实力,chrome浏览器近年来的市场占有率不断上升。reizhi也是chrome的爱好者之一,从最原始的IE,到假死王maxthon,再到轻快的opera,最后让我留恋chrome的理由还是强大的可扩展性。虽然资源占用永远都是抛不开的弱点,但无与伦比的速度和极致的可扩展性是有目共睹的。
reizhi
2022/09/26
1K0
chrome扩展推荐-Tampermonkey
Chrome扩展开发
注:content_scripts段中的代码会在页面加载对应阶段"document_start", “document_end”, or "document_idle"自动注入 但是脚本运行在与页面独立的上下文中,无法访问到原页面的脚本上下文资源 如需访问原页面脚本上下文,可在content_scripts脚本中将web_accessible_resources段中声明的脚本注入到document中 样例: js/content-script.js
路过君
2020/06/19
9430
认识Chrome扩展插件
1、前言 现如今的时代,绝大多数人都要跟浏览器打交道的,说到浏览器那肯定是Chrome浏览器一家独大,具体数据请看👇 知名流量监测机构 Statcounter 公布了 7 月份全球桌面浏览器市场份额,主要数据如下: 浏览器 市场份额 月涨跌份额 Chrome 66.19% -0.74% Edge 10.84% +0.2% Safari 8.94% +0.01% Firefox 8.08% +0.28% Opera 3.06% +0.08% IE 0.75% 浏览器扩展插件的用途 生产力工具(和浏览器进
甜点cc
2022/09/26
1.3K0
从零实现的Chrome扩展
Chrome扩展是一种可以在Chrome浏览器中添加新功能和修改浏览器行为的软件程序,例如我们常用的TamperMonkey、Proxy SwitchyOmega、AdGuard等等,这些拓展都是可以通过WebExtensions API来修改、增强浏览器的能力,用来提供一些浏览器本体没有的功能,从而实现一些有趣的事情。
WindRunnerMax
2023/07/24
6230
给你一台服务器,你能把你写的代码部署到线上吗?
做了啥呢,做了让你不用关心,系统搭建、技术框架、核心组件、通用模块以及上线应用时也只是点点点就可以了,也根本了解不到一台应用服务器是如何,部署环境、开通端口、申请域名、配置SSL的。
IT大咖说
2021/07/19
9270
编写Chrome扩展程序
Chrome的扩展程序很多,也很容易入门,可以来简单实现一下 看看 官方文档 或者翻译的文档:百度、360,慢慢就能实现出一个扩展程序来 每个扩展程序应用一般会包含: 一个manifest清单文件 h
书童小二
2018/09/03
9360
编写Chrome扩展程序
必备!十款 Chrome 编程扩展工具,你少了哪个?
1. Vue.js devtools Chrome 开发者工具扩展,用于调试 Vue.js 应用。 2. React Developer Tools React Developer Tools,可以在
腾讯NEXT学位
2018/05/14
8540
那些实用的 Chrome 扩展神器
之前已经写过不少Chrome扩展那些我常用的 Chrome 扩展,这里继续推荐那些实用Chrome扩展 ,所谓实用就是能解决实际问题。
苏生不惑
2019/12/19
9670
那些实用的 Chrome 扩展神器
你知道 Chrome 专门为调试提供的这些函数吗?
在 Chrome 的 DevTools 中的控制台提供了一些 Debug 专用的函数,每一个都身怀绝技。
疯狂的技术宅
2020/11/26
1.6K0
pdaf相位对焦和激光对焦_双像素相位对焦
1.sensor结构: sensor piexel采用half shield paixel方式如下,这样便可以将光路上下分开,上光路只能接受上面方向来的光,下光路只能接受来自下光路来的光。
全栈程序员站长
2022/10/04
5940
pdaf相位对焦和激光对焦_双像素相位对焦
【扩展阅读】流氓软件你造吗?
“流氓软件”是介于病毒和正规软件之间的软件,通俗地讲是指在使用电脑上网时,不断跳出的窗口让自己的鼠标无所适从;有时电脑浏览器被莫名修改增加了许多工作条,当用户打开网页却变成不相干的奇怪画面,甚至是黄色广告。有些流氓软件只是为了达到某种目的,比如广告宣传,这些流氓软件不会影响用户计算机的正常使用,只不过在启动浏览器的时候会多弹出来一个网页,从而达到宣传的目的。 它具有如下特点: 1、恶意推广: 1)在未明确提示用户或未经用户许可的情况下,在用户计算机或其他终端上强行安装软件的行为,强制安装时不能结束它的进程,
腾讯大讲堂
2018/02/09
8600
【扩展阅读】流氓软件你造吗?
使用 Google Publisher Toolbar 扩展管理站点 AdSense 广告
今天给大家讲讲 Chrome 浏览器明月必装的扩展之一,Google Publisher Toolbar(Google 发布商工具栏)。对于投放了 AdSense 广告的站长们来说,这绝对是个“神器”的存在,无论是管理还是优化自己站点投放的 AdSense 广告都非常的方便,还没有用过的建议大家装上试试。
明月登楼
2018/09/14
1.4K0
使用 Google Publisher Toolbar 扩展管理站点 AdSense 广告
38. 对焦扫描技术是如何实现EDOF(扩展景深)的?
我们之前讲解了37. 如何从失焦的图像中恢复景深并将图像变清晰?,我们看到了编码光圈的应用,它可以让我们很容易估计出局部卷积核,从而可以利用去卷积技术得到全焦图像,甚至还可以得到场景的相对深度图。同时,我们也看到了计算摄影学不仅仅是软件的事情,有的时候也会涉及到一些必要的硬件。
HawkWang
2020/04/17
1.7K0
38. 对焦扫描技术是如何实现EDOF(扩展景深)的?
点击加载更多

相似问题

你能把消息从chrome扩展发送到node.js服务器吗?

118

你能把.resize()绑定到$(文档)而不是$(窗口)吗?

40

你能把钮扣居中吗?

333

Chrome扩展-弹出式/浮动iFrame

17

Google Chrome扩展:弹出式网页

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档