2013-01-04 76 views
1

我的代码更改导航栏项目的标题#变化形式的字符串。据我所知,UI不应该从另一个威胁中改变,那么它就成了,所以我想过使用BackgroundWorker。事实上,我不是在与线程一起工作,有人可以为我的任务提出最佳解决方案吗?C对另一个线程

回答

2

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

但问题是,您的导航栏的项目是在UI线程(假设您正在使用WPF)创建的,而那些不能从另一个线程操纵。

为什么你必须在另一个线程中做到这一点?

5

您可以使用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(); 
} 
+0

NavBarItem没有调用方法 – Edgar

+0

您可以让其他线程在主线程上运行代码。看看他给你的链接。 – Laurence

+1

NavBarItem没有Invoke,但NavBar本身 - 它是该项目的所有者。否则,您可以使用Application.OpenForms找到最顶层的表单,并在该表单上调用Invoke。请参阅[如何获取主窗体](http://stackoverflow.com/questions/1000847/how-to-get-the-handle-of-the-topmost-form-in-a-winform-app) – Matthias