在特定线程中调用方法,而在另一个线程中进行处理
本文关键字:线程 另一个 处理 方法 调用 | 更新日期: 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);