在特定线程中调用方法,而在另一个线程中进行处理

本文关键字:线程 另一个 处理 方法 调用 | 更新日期: 2023-09-27 18:03:33

我开始了一个长时间运行的任务:

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

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

dataTable.Rows.Add(e.Data);

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

我想做这样的事情:

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

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

在特定线程中调用方法,而在另一个线程中进行处理

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

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

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

我相信对于我的场景,来自sell的建议是最有效的。我可以使用SynchronizationContext类和它的Post方法。下面是一个例子:

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

In parallel LongRunningMethod:

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