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メソッドを使うことができます。以下に例を示します。

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

並列のLongRunningMethod:

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