我正在开始这样一个长期运行的任务:
task = Task.Factory.StartNew(LongRunningMethod, TaskCreationOptions.LongRunning);
在 LongRunningMethod 中,我正在调用引发事件的第三方方法。该事件包含我需要添加到数据表中的数据:
dataTable.Rows.Add(e.Data);
麻烦的是, dataTable 可以与某个需要调用 Invoke 方法的视图相关联,但我不想添加任何对接口的引用,实现调用之类的方法。
我想做那样的事情:
originalThread.Invoke(() => dataTable.Rows.Add(e.Data));
实现这一目标的最佳选择是什么?
答案 0 :(得分:2)
通过汇总有用的评论,我可以提供答案。
根据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);