【问题标题】:c# change form strings on another threadc# 在另一个线程上更改表单字符串
【发布时间】:2013-01-04 10:23:22
【问题描述】:

我的代码改变了导航栏项目的标题:

OverviewOrgan_NavBarHelper cNavBarHelper = new OverviewOrgan_NavBarHelper(Organization);

foreach (NavBarItem item in GetNavigationBar.Items)
{                       
    string cCaption = cNavBarHelper.UpdateNavBarItemCaption(item);
    item.Caption = cCaption;
}

现在它在主线程上,但我必须将它移动到另一个线程。我知道 UI 不应该从另一个威胁中改变,然后它就被制作了,所以我考虑使用 BackgroundWorker。 事实上,我不使用线程,有人可以为我的任务建议最佳解决方案吗?

【问题讨论】:

    标签: c# multithreading backgroundworker


    【解决方案1】:

    您可以使用 Invoke 从另一个线程更新 UI。

    看看这个帖子:How to update the GUI from another thread in C#?

    例如:

    MethodInvoker NavBarItemInvoker = (delegate
    {
       OverviewOrgan_NavBarHelper cNavBarHelper = new OverviewOrgan_NavBarHelper(Organization);
    
       foreach (NavBarItem item in GetNavigationBar.Items)
       {                       
           string cCaption = cNavBarHelper.UpdateNavBarItemCaption(item);
           item.Caption = cCaption;
       }
    });
    
    if (InvokeRequired)
    {
       Invoke(NavBarItemInvoker);
    }
    else
    {
        NavBarItemInvoker();
    }
    

    【讨论】:

    • NavBarItem 没有调用方法
    • 您可以让其他线程在主线程上运行代码。看看他给你的链接。
    • NavBarItem 没有 Invoke,但 NavBar 本身 - 它是项目的所有者。否则,您可以使用 Application.OpenForms 找到最顶层的表单并在该表单上调用 Invoke。参考How to get main form
    【解决方案2】:

    have a look at the first answer in this thread. 它解释了如何使用 BackgroundWorker。

    但问题是,导航栏的项目是在 UI 线程中创建的(假设您使用的是 WPF)并且无法从另一个线程进行操作。

    为什么要在另一个线程中做呢?

    【讨论】:

      【解决方案3】:

      我认为您应该为此使用调度程序

      在本文中了解更多信息: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

      【讨论】:

      • 我使用的是 Windows 窗体,而不是 WPF
      猜你喜欢
      • 2019-03-16
      • 2020-03-13
      • 2011-02-19
      • 2022-01-04
      • 1970-01-01
      • 2014-03-15
      • 2012-10-31
      • 2022-10-25
      • 1970-01-01
      相关资源
      最近更新 更多