沒有人詳細討論單獨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