线程冻结主UI

尼克·普罗兹

您好
我当前正在编写服务器监视应用程序。
班级

    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;
    }

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

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.");
  }

问题

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

所有帮助表示赞赏!

尤金·波兹卡尔(Eugene Podskal)

问题在于Dispatcher.Invoke阻止了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 = ...

要么

您可能需要尝试MVVM模式-http: //msdn.microsoft.com/zh-cn/magazine/dd419663.aspx乍一看,它看起来似乎很吓人,太复杂了,几乎没有优势,但是随着时间的推移,您会发​​现它的优点。

这篇特别的文章涉及MVVM和Dispathcer- http://msdn.microsoft.com/zh-cn/magazine/dn630646.aspx

PS:如果您的GetDisksInfo方法使用延迟执行(如LINQ),则应在使用前枚举结果:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程冻结主UI

来自分类Dev

线程冻结 UI - Android

来自分类Dev

ViewPager setCurrentItem冻结UI线程

来自分类Dev

AsyncTask 冻结其线程和 UI 线程

来自分类Dev

WPF UI冻结-UI线程冲突?

来自分类Dev

AsncTask减慢主(UI)线程

来自分类Dev

多个领域事务导致UI线程冻结

来自分类Dev

即使使用线程后,UI也会冻结

来自分类Dev

即使使用线程后,UI也会冻结

来自分类Dev

启动新线程会冻结UI

来自分类Dev

Android AsyncTask onPostExecute脱离主ui线程

来自分类Dev

Textureview.getBitmap()使主Ui线程变慢

来自分类Dev

如何暂停主ui线程(Android)

来自分类Dev

TableView scrollToRow 阻塞了主 ui 线程

来自分类Dev

线程到主UI线程的发布消息被阻止/删除

来自分类Dev

后台线程变慢主UI线程的视觉基础

来自分类Dev

在新线程中执行任务时冻结JavaFX UI

来自分类Dev

从AsyncTask返回位图文件会冻结UI线程

来自分类Dev

异步套接字调用冻结了UI线程

来自分类Dev

BLE扫描在20分钟后冻结UI线程

来自分类Dev

异步套接字调用冻结了UI线程

来自分类Dev

延迟事件处理程序而不冻结UI线程

来自分类Dev

为什么我的 AsyncTask 冻结了我的 UI 线程?

来自分类Dev

RestKit完成块是否在主UI线程上运行?

来自分类Dev

调用WCF服务后,在主UI线程中填充TableView

来自分类Dev

同步,锁定和等待阻止主UI线程

来自分类Dev

在主UI线程上更新控件的正确方法是什么

来自分类Dev

ScheduledThreadPoolExecutor Callable()阻止了我的主Activity UI线程

来自分类Dev

线程是冻结的主要形式