没有人详细讨论单独STA线程的情况(即使概念完全相同)。
让我们想象一个简单的标签控件添加一个按钮点击
private void button_Click(object sender, RoutedEventArgs e)
{
TabItem newTab = new TabItem() { Header = "New Tab" };
tabMain.Items.Add(newTab);
}
如果我们将它移动到另一个STA线程
private void button_Click(object sender, RoutedEventArgs e)
{
Thread newThread = new Thread(new ThreadStart(ThreadStartingPoint));
newThread.SetApartmentState(ApartmentState.STA);
newThread.IsBackground = true;
newThread.Start();
}
private void ThreadStartingPoint()
{
TabItem newTab = new TabItem() { Header = "New Tab" };
tabMain.Items.Add(newTab);
}
当然
我们得到了一个System.InvalidOperationException
现在,如果我们添加控件,会发生什么情况
private void AddToParent(string header)
{
TabItem newTab = new TabItem() { Header = header };
tabMain.Items.Add(newTab);
}
使用委托方法?
public void DelegateMethod(string header)
{
tabMain.Dispatcher.BeginInvoke(
new Action(() => {
this.AddToParent(header);
}), null);
}
它的工作,如果你把它
private void button_Click(object sender, RoutedEventArgs e)
{
Thread newThread = new Thread(new ThreadStart(ThreadStartingPoint));
newThread.SetApartmentState(ApartmentState.STA);
newThread.IsBackground = true;
newThread.Start();
}
private void ThreadStartingPoint()
{
DelegateMethod("new tab");
}
原因当然现在我们保持视觉树在同原来的线程。
还有一个问题:Background Worker方法有可能返回某些特定类型的值吗? – Polaris 2010-05-04 07:08:37
检查RunWorkerCompleted方法中的e.Result属性。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx。 – Amsakanna 2010-05-04 07:18:55