UI线程块

2024-04-12

我创建了一个简单的 WPF 应用程序,并向默认窗口添加了一个按钮。当我单击按钮时,会调用一个模拟的长工作方法(使用 Thread.Sleep(15000) 进行模拟)。我试图使按钮异步执行,但是尽管遵循在线示例,按钮和整个窗口都会在我锁定时立即锁定单击并保持该状态直到 Thread.Sleep(...) 完成。

有什么想法为什么会发生这种情况吗?

这是代码:

private void button1_Click(object sender, RoutedEventArgs e)
{
   DoSomeAsyncWork();
}

private void DoSomeAsyncWork()
{
     System.Windows.Threading.Dispatcher.Run();
     Thread thread = new System.Threading.Thread(
         new System.Threading.ThreadStart(
          delegate()
          {
               Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => Thread.Sleep(15000)));
          }
        ));
     thread.Start();
}

您正在将长操作放回到 UI 线程中。让我评论一下你的例子:

Thread thread = new System.Threading.Thread( 
    new System.Threading.ThreadStart( 
        delegate() { 
            // here we are in the background thread

            Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
                new Action(() => {
                    // here we are back in the UI thread
                    Thread.Sleep(15000);
                })); 
      } 
    )); 

因此,您应该像这样修改您的示例:

Thread thread = new System.Threading.Thread( 
    new System.Threading.ThreadStart( 
        delegate() { 
            // here we are in the background thread

            Thread.Sleep(15000);  // <-- do the long operation here

            Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
                new Action(() => {
                    // here we are back in the UI thread

                    // do stuff here that needs to update the UI after the operation finished
                })); 
      } 
    )); 

正如其他人提到的,使用 BackgroundWorker 类更容易。这是一个例子:

private void DoSomeAsyncWork()   
{   
    BackgroundWorker bw = new BackgroundWorker();

    bw.DoWork += (sender, args) => {
        // do your lengthy stuff here -- this will happen in a separate thread
        Thread.Sleep(15000);
    }

    bw.RunWorkerCompleted += (sender, args) => {
        if (args.Error != null)  // if an exception occurred during DoWork,
            MessageBox.Show(args.Error.ToString());  // do your error handling here

        // do any UI stuff after the long operation here
        ...
    }

    bw.RunWorkerAsync(); // start the background worker
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UI线程块 的相关文章

  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何从WPF中的另一个窗口调用方法

    我有两个窗户win1用于显示用户列表和其他win2用于添加用户 我还有一种在删除 更新或添加用户后刷新网格的方法 这个方法是在win1 我如何调用这个方法win2添加用户后 这是一个非常基本的面向对象设计问题 所以您希望能够从win2到一个
  • 将 MahApps 图标与 ContextMenu 结合使用

    我正在使用 MahApps Metro UI 工具包编写 WPF 应用程序 http mahapps com guides quick start html http mahapps com guides quick start html
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何使用 MVVM 打开和关闭新 Windows?

    对于 MVVM 和 WPF 什么是处理打开和关闭新窗口和对话框的好 直接方法 打开和关闭应该由 ViewModel 驱动 对吗 但 ViewModel 不应该知道视图 我通常为此使用接口 例如 如果我想在单独的窗口中编辑记录 我有一个接口
  • 如何将 WPF 窗口置于前面?

    我创建了一个单实例应用程序 并且希望在用户多次启动该应用程序时激活已打开的窗口 这工作正常 但我有一个问题 如果已经打开的窗口超出了另一个应用程序窗口 我必须将其放在前面 我尝试过 window Focus 和 window Show 但它
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • 如何更改 OxyPlot Y 轴字符串格式?

    谁能告诉我如何更改 Y 轴字符串格式 我想向 Y 轴百分比添加百分号 我正在使用 OxyPlot 在 wpf 中生成图表 这是我的尝试 但它不起作用 Func
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 当其他列子项折叠时调整 WPF 网格列的大小?

    我有两个控件Grid 并且需要制作一个来填充所有Grid另一个获得后的空间Collapseded 我不知道什么Container我可以使用吗 我试过了StackPanel and DockPanel我也是 但找不到好的解决方案 这是我的代码
  • 如何清除 (WPF) DataGrid 中的单元格(使其获取 NULL 值)?

    我们有一个列绑定到一个可为空的 SQL 整数值 当用户尝试 清除 单元格时DataGrid 我们得到验证错误 无法转换 如何将其设置为空并将 空 值绑定到基础列 我已经用谷歌搜索了这个问题两天并找到了任何东西 我试图编辑我对 HCL 的评论
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe
  • 如何将文本放在 RadioButton 的顶部

    我正在尝试实现附件中显示的效果 但没有成功 甚至有可能吗 我试图将文本框放在单选按钮内 并将其设置为水平和垂直内容对齐 但它没有按我想要的方式工作 欢迎任何建议 Resource
  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange

随机推荐

  • Rails:用空对象模式替换 try

    在我的大多数应用程序中 我都有一个current user方法 为了避免在类似情况下出现异常current user name where current user is nil rails 提供了try方法 问题是我需要记住使用try无论
  • 声明普通类和类模板的静态数据成员

    我读到在源文件中定义静态数据成员的原因是因为如果它们位于头文件中并且多个源文件包含头文件 定义将多次输出 我可以理解为什么这对于静态常量数据成员来说是一个问题 但是为什么这对于静态数据成员来说是一个问题呢 我不太确定我完全理解如果定义写在头
  • 如何在django过滤器中做小于或等于和大于等于?

    如何在django过滤器中做小于或等于和大于等于 就像 我想获得周围的价值 10 lt val lt 50在 Django 视图中 为此 我在 sql 中使用了一些查询 如下所示 select count from table name w
  • Linux 中的直接内存访问

    我正在尝试直接访问嵌入式 Linux 项目的物理内存 但我不确定如何最好地指定内存供我使用 如果我定期启动设备并访问 dev mem 我就可以轻松地读写任何我想要的位置 然而 在这里 我访问的是可以轻松分配给任何进程的内存 我不想做 我的
  • Google Dataproc 上的 Spark UI 位于何​​处?

    我应该使用什么端口来访问 Google Dataproc 上的 Spark UI 我尝试了端口 4040 和 7077 以及我发现使用的许多其他端口netstat pln 防火墙配置正确 Dataproc 在 YARN 之上运行 Spark
  • 注册 COM 接口的实现

    我是 COM 编程新手 我已经准备好了一个 COM 对象 以及关联的 IClassFactory 但我不太清楚如何注册生成的 DLL 以供其他程序使用 我也不清楚需要携带的 GUID 数量 我尝试注册的 COM 对象实现了 IAudioSe
  • 如何使用 Flutter 编写带有要点的段落?

    使用 HTML 我可以向段落添加项目符号 如下所示 ul li example li li example li li example li ul 如何在 Flutter 中编写要点形式 new Text 如果您不想下载另一个库 例如 fl
  • 使用 sed 仅打印每个段落的第一个单词

    我想知道如何用 sed 单行打印出每个段落的第一个单词 在本例中 段落由 2 个换行符后面的文本定义 e g This is a paragraph with some text Some random text that is not r
  • Xamarin:使用布局的启动屏幕

    我正在尝试为我的 Android 应用程序创建启动屏幕 如此链接所示http developer xamarin com guides android user interface creating a splash screen http
  • 如何在 JLayeredPane 上设置背景颜色?

    我很好奇为什么在 JLayeredPane 上调用 setBackground Color 似乎并没有真正设置背景颜色 我猜这与 JLayeredPane 由于某种原因必须具有透明背景有关 不管怎样 这里有一些代码显示了这个问题 这是在 M
  • ajax请求后如何更改URL?

    我有一个菜单 其中包含一些更新 div 的链接content并执行该函数onSuccess加载后 li Ajax ActionLink Home Index home li li Ajax ActionLink Download Index
  • 通过编辑 AOSP 将 Android 导航栏放在侧面

    我想通过编辑 AOSP 将导航栏 具有后退 主页和菜单等系统软键 而不是导航抽屉 放在 右侧 侧 如下所示 Status bar always N Layout with background drawable a v Title Acti
  • Java - 替换 JFrame 中的组件

    我正在努力使用 java GUI 提前感谢您的帮助 我有一个 JFrame 其中有几个组件 按钮 J 按钮 触发动作侦听器 comp这是我试图替换的一个组件JScrollPane其中有一个组件 组件的类型无关紧要 可以是文本字段 表格或任何
  • android - TextView 中自动滚动的问题

    我有一个Activity它用作音乐播放器 当它开始时 一个MediaPlayer对象被初始化并启动 在布局中 我有TextViews显示艺术家和标题 这些值 从服务器检索 可能很长 所以我添加了 android ellipsize marq
  • ruby 中的网络掩码到 CIDR

    我一直在使用 ip address gem 它似乎无法从以下形式的网络掩码进行转换 255 255 255 0 进入 CIDR 表格 24 有谁知道如何快速将前者转换为后者 这是快速而肮脏的方法 require ipaddr puts IP
  • 使用 ramdajs 重命名对象的属性

    我需要使用以下命令将可能包含连字符的单词重写为驼峰命名法的对象的所有属性ramdajs 示例 属性名称animation timing function应该成为animationTimingFunction每个键依此类推 您能否举个例子 这
  • 为什么缩放填充会给出比 UIImageVIew 尺寸更大的图像? (使用快速)

    我正在尝试显示地名列表 包括它的照片PFQueryTableViewController 它包含在 ParseUI SDK 中解析网 http parse com 我已经成功地展示了图像 不幸的是 当我将 UIImageView 模式更改为
  • 需要帮助在 javascript 中的表之间切换

    我试图使用两个按钮来使用 javascript 在两个表之间切换 但是每当我测试时 两个表都会出现 而不是只出现一个 var table1 document getElementById table1 var table2 document
  • 最小可行的网站图标代码

    我很困惑什么是让网站图标在大多数手机和浏览器上工作的最简单方法 1 一些网站 https mathiasbynens be notes touch icons建议使用以下内容就足够了 这适用于 iOS 8 并且应该适用于 Android B
  • UI线程块

    我创建了一个简单的 WPF 应用程序 并向默认窗口添加了一个按钮 当我单击按钮时 会调用一个模拟的长工作方法 使用 Thread Sleep 15000 进行模拟 我试图使按钮异步执行 但是尽管遵循在线示例 按钮和整个窗口都会在我锁定时立即