2011-12-29 78 views
0

我嘗試以下操作:在後臺線程WPF中創建一個用戶界面?

var task = new Task(() => 
    { 
     for (int i=0; i<10; i++) { 
      //Create new Grid HERE 
      // Add Table with some dynamic data here.. 
      // print the above Grid here. 
     } 

    }); 

task.ContinueWith((previousTask) => 
    { 
     label.Content = printerStatus(); // will return "Out of Paper", "printing", "Paper jam", etc. 
    }, 
    TaskScheduler.FromCurrentSynchronizationContext()); 

label.Content = "Sending to printer"; 

它返回以下錯誤:調用線程必須爲STA,因爲許多UI組件都需要這個..

當它試圖創建一個新的UI對象電網出現的錯誤。

我該如何解決這個問題?讓我知道如果有任何其他方式周圍!

回答

2

任務使用MTA中的線程池線程。

如果你想有一個後臺STA線程,你必須自己創建並明確設置ApartmentState

Thread t = new Thread(...); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 
+0

內部消息隊列,你能告訴我的示例代碼。我對這項技術很陌生。 – user995387 2011-12-29 11:58:16

+0

我如何知道使用此任務是否完成? – user995387 2011-12-29 12:03:02

+0

我建議閱讀[Joe Albahari](http://www.albahari.com/threading/)瞭解基礎知識。如果你想要一個STA,你必須使用Threads not Tasks,所以你沒有'ContinueWith'。您將不得不使用線程方法內部的Dispatcher.Invoke。 – 2011-12-29 12:19:19

1

使用分派爲標籤和調用可能幫助:

label.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal, 
     new Action(
     delegate() 
     { 
      label.Content = printerStatus(); 
     } 
    )); 
+0

它無法創建網格!它會在創建Grid對象時顯示錯誤。 – user995387 2011-12-29 12:04:16

+0

你是什麼意思的網格,你的意思是DataGridView或簡單的網格數據結構。 – crypted 2011-12-29 12:19:39

+0

WPF網格。保存UI內容..msdn.microsoft.com/en-us/library/system.windows.controls.grid.aspx – user995387 2011-12-29 12:28:50

1

不能比主UI線程創建在不同的線程UI對象,因爲一旦你將它們添加到用戶界面,它嘗試設置Parent屬性,並且WPF中的線程無法修改在其他線程上創建的對象。

相反,我建議在第二個線程上創建一個Grid的數據列表或集合,並使用類似ItemsControl的方式將其綁定到UI。這將保持主UI線程上的所有UI對象,而後臺處理可以在後臺線程上完成。

要從後臺線程(例如狀態標籤)更新UI對象,我建議使用Dispatcher,如lawrencealan's answer建議。該Dispatcher是WPF的主UI線程

+0

這是一個很大的緩解一定程度上..謝謝 – user995387 2011-12-29 16:37:19

相關問題