线程冻结主 UI

2024-04-04

Hello
我目前正在编写一个服务器监控应用程序。
Classes

    public class Server
    {
            public string SERVERNAME;
            public string ENVIRONMENT;
            public string VERSION;

            public string CPU_PERCETAGE;
            public string CPU_NAME;
            public string CPU_DESCRIPTION;
            public string CPU_VOLTAGE;
    }

目前,我的主窗口中有一个页面,我可以在其中执行并填充数据:
Method

try
 {
   {
    Thread test = new Thread(() =>
    {
     datagrid_Disks.Dispatcher.BeginInvoke(
      new Action(() =>
      {
        datagrid_Disks.ItemsSource = Server.GetDisksInfo(textbox_Username.Text,
                                                           textbox_password.Password,
                                                           textbox_IP.Text,
                                                           textbox_Domain.Text);
      }));
     });
     test.Start();
  }
  catch (UnauthorizedAccessException)
  {
    Worker.ShowModernBox("Onjuiste gebruiksersnaam" + Environment.NewLine + "of wachtwoord.");
  }
  catch (ManagementException)
  {
   Worker.ShowModernBox("Server geeft geen Response." + Environment.NewLine + "Controleer Aub de instelling.");
  }

Problem

我的 mainThread 等待线程完成,似乎无法弄清楚为什么会发生这种情况。

感谢所有帮助!


问题是调度程序.调用 http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke(VS.100).aspx阻塞 UI 线程,所以任何Invoke应尽可能小。

将耗时的代码放在调用之外来解决问题。

正如 @RohitVals 所指出的,您无法从后台线程访问 UI 控件,因此您必须使用 2 个调用 - 一个用于获取文本值,一个用于设置ItemsSource :

Thread test = new Thread(() =>
{
    String text, password, ipText, domainText;

    // !!!!!!This one should be simple Invoke because otherwise variables may not get their         
    // values before calls. Thanks @ScottChamberlain.!!!!!!
    datagrid_Disks.Dispatcher.Invoke(
      new Action(() =>
      {
          text = textbox_Username.Text;
          password = textbox_password.Password;
          ipText = textbox_IP.Text,
          domainText = textbox_Domain.Text
      }));


     var result = Server.GetDisksInfo(text, 
         password, 
         ipText,
         domainText);

     datagrid_Disks.Dispatcher.BeginInvoke(
      new Action(() =>
      {
        datagrid_Disks.ItemsSource = result;
      }));
 });

 test.Start();

或者(感谢@RohitVals)

您可以在运行线程之前获取这些值以避免双重调度:

text = textbox_Username.Text;
// ...

Thread test = ...

OR

您可能想尝试 MVVM 模式 -http://msdn.microsoft.com/en-us/magazine/dd419663.aspx http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。它可能看起来令人生畏,而且太复杂,一开始没有或几乎没有优势,但随着时间的推移,你会看到它的优点。

这篇特别的文章涉及 MVVM 和 Dispatcher -http://msdn.microsoft.com/en-us/magazine/dn630646.aspx http://msdn.microsoft.com/en-us/magazine/dn630646.aspx

P.S.:如果你的GetDisksInfo方法使用延迟执行(如 LINQ),那么您应该在使用它之前枚举结果:

 var result = Server.GetDisksInfo(text, 
         password, 
         ipText,
         domainText).ToArray();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程冻结主 UI 的相关文章

  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • WPF ListBox - 如何从数据表中放入值?

    I have ListBox并希望将值放入此列表框中DataTable listBoxVisibleFields DataContext SelectedFields Where SelectedFields is a DataTable充
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 如何打开 Windows 资源管理器窗口并选择特定文件夹

    我有一个 winform 应用程序 这个 winform 应用程序创建了几个文件 我想在我的应用程序中实现 查找目标 功能来显示这些文件 这些文件位于同一文件夹中 看图片 假设我创建了几个文件 C Test 文件夹 该文件夹包含以下文件 C
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem

随机推荐

  • 简单参数化查询出错 - Java/ SQL

    继我之前的一个问题之后方法设计 https stackoverflow com questions 5490214 method design clarity or multifunction建议我将 SQL 查询实现为参数化查询 而不是简
  • Perl 中数组是如何实现的?

    Perl 数组是一种抽象数据类型 Perl数组的内部机制是什么 是用动态数组还是链表实现的 由于数组元素可以随机访问 因此我假设动态指针数组或对标量的引用是有意义的 但是 如果在数组头部进行移位和取消移位操作 数组是否必须通过这些操作移动其
  • 服务层相互依赖

    我正在设计一个使用服务层的 asp net mvc 应用程序 如果我们有一个服务依赖于另一个服务怎么办 例如 假设我们有以下模型 class UserService IUserService implementation requires
  • Angular ui-grid 表、客户端分页和滚动

    我正在尝试将一个小项目从 jquery 移植到 angularjs 我使用 DataTables 绘制从虚拟机接收到的诊断数据 这是一个示例 DataTables 可以轻松地对数据进行分页 这样做的好处是在导航时不捕获鼠标滚动 这是当页面包
  • 获取/读取 laravel 5.8 存储非公共文件夹文件以查看?

    尝试从我的视图访问 storage app folder1 a png public function viewStorageFiles fileFullPath Storage disk local gt path folder1 a p
  • Laravel 5.4 迁移错误

    我面临着一个无法解决的问题 我的应用程序使用 Ubuntu 16 04 PHP 7 1 MySQL 和 NGINX 托管在我的服务器上 我的应用程序运行完美 当我 ssh 到我的服务器和应用程序根目录时 我运行以下命令 php artisa
  • 为什么Python的shelf要求所有键都是字符串?

    有据可查 Python 的 shelve 模块要求所有键都是字符串 并且有各种解决方法 请参阅线程here https stackoverflow com questions 4013452 how do i take integer ke
  • Domino R9.0.1 FP4:禁用与 ImportConvertHeaders 相关的日志记录?

    最近 我们安装了FP4 现在控制台上有很多消息 当使用 XPages 从浏览器打开或保存邮寄文档时 就会发生这种情况 邮件中的富文本字段采用 MIME 格式 许多行出现引用 ImportConvertHeaders 例如 25 06 201
  • 在 Firefox 中以编程方式单击 标签不起作用

    我有一个问题click jquery 的函数 我创建一个 a 元素与document createElement a 并想致电click 关于该元素的功能 关于这个元素 我想创建一个 Excel 文件并将其保存在桌面上 My code bo
  • iOS 7:如何为 UIControlStateHighlighted 设置 UIBarButtonItem backButtonBackgroundImage?

    我正在尝试在正常和突出显示状态下设置后退按钮的背景图像 void configureBackButtonInNavigationItem UINavigationItem item UIBarButtonItem backBarButton
  • 使用 Vim 命令打开标记中的当前文件

    我一直在尝试为 Brett Terpstra 的 Marked 应用程序创建一个命令 不幸的是我无法让它工作 上标记奖励包 http support markedapp com kb how to tips and tricks marke
  • 使用 Python 将 JSON 插入 MySQL

    我有一个 Python 中的 JSON 对象 我正在使用 Python DB API 和 SimpleJson 我正在尝试将 json 插入 MySQL 表中 目前出现错误 我相信这是由于 JSON 对象中的单引号 造成的 如何使用 Pyt
  • 如何识别该图像中的矩形?

    我有一张带有水平线和垂直线的图像 事实上 这张图片是BBC网站转换成水平线和垂直线的 我的问题是我希望能够找到图像中的所有矩形 我想编写一个计算机程序来查找所有矩形 有谁知道如何做到这一点或提出有关如何开始的想法 作为一个人 这个任务对于我
  • 为什么 Bootstrap 的滚动间谍不工作?

    我有一个简单的 Bootstrap 模式设置 在模式中我有内容nav并设置了滚动间谍 但是 它不起作用 我看到它被激活 但导航从未更新 完整的源代码在这里太长了 你将无法看到我得到的效果 所以我设置了一个jsfiddle http jsfi
  • AAudio 或 OpenSL

    我开始用 C 实现我的游戏音频部分 我看到有 2 个可用的音频框架 AAudio https developer android com ndk guides audio aaudio aaudio html https developer
  • 如何在Unity3D中创建脚本图标?

    I created a scipt and editor for it Now I want to assosiate an icon with it like this 这样的事该怎么办呢 找不到任何文档 http unity3d com
  • 如何从 .NET Core 3.0 WPF 应用程序使用 SOAP Web 服务

    I have a SOAP web service I want to consume it in my WPF app I am using NET Core 3 0 Visual Studio 2019 So I used the Mi
  • 如何计算两个时间字符串之间的时间间隔

    我有两个时间 一个开始时间和一个停止时间 格式为 10 33 26 HH MM SS 我需要两个时间之间的差异 我一直在浏览 Python 文档并在线搜索 我想它可能与日期时间和 或时间模块有关 我无法让它正常工作 并且只在涉及约会时寻找如
  • 在 do...while 中将相关表达式匹配设置为 false

    我正在尝试编写一些非常基本的代码 但我也在正则表达式上挑战自己 我已经能够将代码搞乱到一定程度 但我真正遇到的问题是我试图在表达式为 false 时运行 do while 循环 此时我完全没有收到任何错误 但 do while 循环继续运行
  • 线程冻结主 UI

    Hello我目前正在编写一个服务器监控应用程序 Classes public class Server public string SERVERNAME public string ENVIRONMENT public string VER