2013-03-12 118 views
3

處理我開始一個長期運行的任務這樣的:在特定線程調用方法,而在另一個線程

task = Task.Factory.StartNew(LongRunningMethod, TaskCreationOptions.LongRunning); 

LongRunningMethod我打電話這是引發事件的第三方方法。這事件包含了我需要添加到我的數據表中的數據:

dataTable.Rows.Add(e.Data); 

麻煩的是,該的dataTable可以與一些認爲需要調用調用方法有關,但我不希望添加任何對接口的引用,實現調用類似的方法。

我願做這樣的事情:

originalThread.Invoke(() => dataTable.Rows.Add(e.Data)); 

什麼是實現這一目標的最佳選擇嗎?

+3

什麼樣的應用(的WinForms,WPF,...)? – 2013-03-12 10:18:00

+0

@HenkHolterman:任何類型的表示層應該能夠連接到我的數據源(這裏是_dataTable_),但如果行將被添加到不同的線程中,其中一些會引發異常。那就是問題所在。 – 2013-03-12 10:21:42

+0

你不能「闖入一個線程」,你只能將一個方法推送(調用)到一個消息隊列,例如WPF Dispatcher或WinForms應用程序。你將需要一個幫手類。 – 2013-03-12 10:24:13

回答

1

通過整合有用的意見,我可以產生一個答案。

Henk Holterman,有沒有可能中斷原來的線程,存儲上下文,執行某些操作,然後恢復它以前的情況和進一步運行。

目標表示層有特定的解決方案,如WinForms中的BackgroundWorker Class和WPF中的Dispatcher Class

我相信,我的方案從sll建議效果最好。我可以使用SynchronizationContext Class及其Post Method。下面是一個例子:

originalSynchronizationContext = SynchronizationContext.Current; 
task = Task.Factory.StartNew(LongRunningMethod, TaskCreationOptions.LongRunning); 

與此同時LongRunningMethod:

originalSynchronizationContext.Post(state => dataTable.Rows.Add(e.Data), null); 
相關問題