3

我正在开始一个长期运行的任务:

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

LongRunningMethod 中,我正在调用引发事件的第三方方法。该事件包含我需要添加到我的数据表中的数据:

dataTable.Rows.Add(e.Data);

问题是,dataTable可以与一些需要调用Invoke方法的视图相关联,但我不想添加对实现类似Invoke方法的接口的任何引用。

我想做这样的事情:

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

实现这一目标的最佳选择是什么?

4

1 回答 1

2

通过汇总有用的评论,我可以得出答案。

根据Henk Holterman的说法,不可能中断原始线程,存储其上下文,执行某些操作,然后恢复其先前的上下文并继续运行。

目标表示层有特定的解决方案,如WinForms 中的BackgroundWorker 类和 WPF 中的Dispatcher 类

我相信对于我的场景,来自sll的建议效果最好。我可以使用SynchronizationContext 类及其Post Method。下面是一个例子:

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

并行 LongRunning 方法:

originalSynchronizationContext.Post(state => dataTable.Rows.Add(e.Data), null);
于 2013-03-12T13:25:28.460 回答