Dispatcher.BeginInvoke() 未异步运行

2024-05-05

这是我想做的事情的简化版本:

onClick abutton, a aNewMethod()将异步运行以保持 UI 响应。就是这样!

我读过一些答案,这是我能想到的:

    private async void button_Click(object sender, RoutedEventArgs e)
    {
        Task task = Task.Run(() => aNewMethod());
        await task;
    }

    private void aNewMethod()
    {
        if (progress.Value == 0)
        {
            //Heavy work
            for (int i = 1; i < 1000000000; i++) { }
            progress.Value = 100;
        }
    }

正如您可能已经想到的,这会引发System.InvalidOperationException at if(progress.Value== 0)说:

调用线程无法访问此对象,因为不同的 线程拥有它。

经过一番谷歌搜索后,我读到我需要一个Dispatcher.BeginInvoke()更新/使用 UI 控件的方法,所以我这样做了:

    private void aNewMethod()
    {
        Dispatcher.BeginInvoke((Action)delegate {
            if (progress.Value == 0)
            {
                //Heavy work
                for (int i = 1; i < 1000000000; i++) { }
                progress.Value = 100;
            }
        });
     }

这解决了System.InvalidOperationException但它不是异步运行,因为 UI 仍然冻结在for loop

所以问题是:如何运行aNewMethod();异步并且仍然更新并与 UI 控件交互?


调度程序在 UI 线程中运行。它处理您的 UI,并执行您通过 BeginInvoke 等传递给它的操作。 但它一次只能处理一件事;当它忙于处理您的操作时,它不会同时更新 UI,因此 UI 会同时冻结。

如果您希望保持 UI 响应能力,则需要在单独的非 UI 线程中运行重负载函数。在其他线程上运行的这些函数中,只要需要访问 UI,您就可以调用调度程序 - 理想情况下,只需非常短暂地更新 UI 元素。

换句话说,您希望在单独的线程中运行睡眠函数,然后在需要设置进度值时从您自己的线程调用调度程序。就像是

private void button_Click(object sender, RoutedEventArgs e)
{
    Task task = Task.Run(() => aNewMethod());  // will call aNewMethod on the thread pool
}

private void aNewMethod()
{
    double progressValue = 0;
    Dispatcher.Invoke(() => progressValue = progress.Value);

    if (progressValue == 0)
    {
        Thread.Sleep(3000); // still executes on the threadpool (see above), so not blocking UI
        Dispatcher.Invoke(() => progress.Value = 100 );  // call the dispatcher to access UI
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dispatcher.BeginInvoke() 未异步运行 的相关文章

随机推荐

  • 仅在 MarshMallow(6.0 和 6.0.1)上使用 MapActivity 进行 MapView 会使应用程序崩溃

    我正在使用 MapActivity 扩展我的活动 以动态实现 MapView 其中包含显示 mapView 的片段 public abstract class BaseHomeActivity extends MapActivity 我已经
  • iframe 不读取 Chrome 中的 cookie

    Chrome 不允许子 iframe 读取自己的 cookie 我有一个带有子 iframe 的父网页 家长在https first site com 孩子在 父级内部 cookie set with 小路 安全 真实 仅http 假 域名
  • ROW() 函数在 SUM() 和 SUMPRODUCT() 中的行为不同

    问题定义 在单元格中输入任意数字A1 现在在第一行的任意位置尝试以下公式 SUM INDIRECT A ROW and SUMPRODUCT INDIRECT A ROW 第一个公式进行计算 第二个公式给出 VALUE 错误 这是由于ROW
  • 找到分类的重要特征

    我正在尝试使用逻辑回归模型对一些脑电图数据进行分类 这似乎给出了我的数据的最佳分类 我拥有的数据来自多通道 EEG 设置 因此本质上我有一个 63 x 116 x 50 的矩阵 即通道 x 时间点 x 试验次数 有两种试验类型 均为 50
  • 如何在没有 Express 的情况下通过 Mongoose 与 MongoDB 交互?

    我想要一个可以牢固掌握 CRUD 操作如何工作的环境 到目前为止 我一直在使用views看看数据是什么样子 但由于明显缺乏灵活性 这种方法并不是那么有洞察力 这就像在黑暗中开车一样 现在我希望能够通过 Mongoose 提供的功能来处理 M
  • 一般重写 Scala 案例类

    是否可以通用地替换案例类中的参数 更具体地说 假设我想要一个接收 查找 案例类和 替换 案例类 如语法规则的左侧和右侧 以及目标案例类的替代函数 并且该函数将返回将查找案例类的参数替换为替换案例类的新案例类 该函数还可以简单地采用一个案例类
  • 如何使用 Office.js 查找 Office AddIn Host(它是 Word 应用程序还是 Excel)?

    我正在创建一个 Office AddIn 它可以在 Excel 和 Word 应用程序中使用 并且基于主机 如果它是 Word 或 Excel 主机 我想执行不同的逻辑 我正在使用office js 创建office Addin 例如 le
  • MUI 数据表上的 selectRow

    这是我第一次尝试MUI 数据表 https github com gregnb mui datatables在反应中 我想从复选框中选择的行中获取数据 const options download false print false vie
  • 如何在 mongodb 中使用一个查询更新每个值

    我有一个数据如下 id 1 exist true id 2 exist false id 3 exist false 当我 findOneAndUpdate id 2 exist true 时 我希望使用聚合等在一个查询中自动将 id 1
  • 如何从 UIActivityViewController 获取标题和 messageBody 元数据到自定义 UIActivity?

    从 iOS 13 开始 您可以创建一个UIActivityViewController用一个UIActivityItemsConfiguration 那有一个perItemMetadataProvider允许您提供标题和消息正文的回调 完成
  • 结合使用 COUNTIF 和 VLOOKUP EXCEL

    我有多个电子表格workbook我想要以下基本内容English talk IF worksheet1 cell A3 出现在 工作表 2 B 列中 计算它在 工作表 2 b 列中出现的次数 换句话说 让我们说A3 BOB smith 在工
  • 当你不需要Python中的索引时,如何创建For循环? [复制]

    这个问题在这里已经有答案了 如果我需要一个forPython 中的循环 for i in range 1 42 print spam 但不要使用i对于任何事情 pylint 都会抱怨未使用的变量 我应该如何处理这个问题 我知道你可以这样做
  • 关于Java中trim()方法的查询

    我之前提出了一个问题 但遭到了严厉的批评 所以我在这里再次提出 更简单 并重新措辞以吸引那些可能担心我之前提出问题的方式的人 背景 我正在解析一些 HTML 以获取信息 我将所有内容隔离在一系列行中 但我希望抓取的内容以及后面的一堆空格 为
  • 在哪里声明类常量?

    我使用类成员来保存常量 例如 function Foo Foo CONSTANT1 1 Foo CONSTANT2 2 这工作得很好 除了它看起来有点无组织 所有代码都特定于Foo遍布全球范围 所以我考虑将常量声明移到内部Foo 声明 但是
  • C 获取监听服务器的IP

    我正在使用 C 套接字编写客户端 服务器程序 我指定服务器可以通过使用 sockaddr in sin addr s addr 中的 INADDR ANY 侦听任何网络接口 这相当于 IP 0 0 0 0 我可以获取服务器正在监听的实际IP
  • APT:Post-Invoke 在 debian:bookworm-slim 上失败

    我有一个 Jenkins 管道 它使用docker dind 20 在这个过程中我做 FROM ruby 3 2 slim bookworm apt get update 当我尝试使用我的本地构建映像 MacOS ventura 时dock
  • 如何使用静态方法最小起订量静态类(UnitOfWork 情况)?

    我有这些课程 public static class UnitOfWorkSS public static IUnitOfWork Begin return IoC Resolve
  • CSS:变换:翻译(-50%,-50%)使文本模糊[重复]

    这个问题在这里已经有答案了 我想将我的div我使用这种方法 但它使我的文本在div blurry div top 50 left 50 webkit transform translate 50 50 transform translate
  • iOS - App Store - 更改订阅的到期日期

    我想使用 Play 商店 API 更改 Play 商店中订阅的到期日期 我有一个移动应用程序 您可以在其中购买续订应用商店订阅或者您可以从应用程序中的促销活动中免费获得一些时间 这里的主要问题是如果您已从 App Store 购买了订阅 并
  • Dispatcher.BeginInvoke() 未异步运行

    这是我想做的事情的简化版本 onClick abutton a aNewMethod 将异步运行以保持 UI 响应 就是这样 我读过一些答案 这是我能想到的 private async void button Click object se