我有一個線程在wpf中生成GUI元素。畫布是有繪製對象(矩形等...)Task.Factory和線程之間的通信
這WPF線程調用另一個線程讓我們命名它的計算線程。該線程計算要在畫布中顯示的元素的大小和位置等。
我想讓這兩部分(GUI和計算)在不同的線程中運行。 「計算線程」基於一個沒有引用wpf功能的庫。
現在我想顯示由wpf線程顯示的計算線程的中間數據。 我做這樣的說法:
的計算線程觸發一個事件(DataReady)由WPF的線程來實現:
void MyRegStringObject_DataReady()
{
if (DebugMode)
MyDrawingBoard.DrawRegElements();
}
現在的問題是,這將引發錯誤: 「調用線程不能訪問這個對象,因爲不同的線程擁有它」
這裏有一些在stackoverflow引用這個錯誤的回答問題,但沒有一個可以幫助我的情況。
功能DrawRegElements()要清除畫布對象(除其他事項外):
curCanvas.Children.Clear();
在在引發錯誤的代碼這個位置。 似乎由calc-thread觸發的函數MyRegStringObject_DataReady也被calc-thread所支付。但是在類中定義了wpf-thread基於。
我該如何解決這個問題?有人有什麼主意嗎? 順便說一句: 的鈣線程稱爲是這樣的:
CalcElements = Task.Factory.StartNew<bool>(MyRegStringObject.CalcRegElements);
當線程完成我定義:
CalcElements.ContinueWith((FinishCalcRegElements) =>
{
MyDrawingBoard.DrawRegElements();
}, CancellationToken.None, TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
沒有異議。 Everythins運行完美。 ContinueWith中定義的函數似乎由wpf-thread所支持。
當你說'Dispatcher.Current'你的意思是[Dispatcher.CurrentDispatcher](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.currentdispatcher.aspx),對不對?我猜想MyDrawingBoard是某種WPF控件,所以'MyDrawingBoard.Dispatcher.BeginInvoke'就可以。 – Clemens 2012-03-12 10:52:19
右'CurrentDispatcher',已修復。你試過這個嗎? – sll 2012-03-12 10:58:24
@ sll Dispatcher.CurrentDispatcher.BeginInvoke並沒有真正的工作我不知道爲什麼,但UI線程接收到工作線程觸發的事件,但DrawRegElements沒有被調用。它只在最後被調用(當工作線程完成時)。 – manton 2012-03-12 11:05:41