3

UIをロックしないように、何らかの処理を行うためのスレッドを作成するマルチスレッドプロセスを設計しています。ただし、このスレッドが完了すると(エラーなしで正常に完了する場合)、UIを適切に更新するメソッドをUIスレッドで実行できるようにイベントが必要です。

どうすればこれを正しく達成できますか?

スレッドの簡単なコード:

Thread t = new Thread(new ThreadStart(GetAppUpdates));
t.Start();

スレッドがいつ完了するかを知る必要がありますが、UIの遅延が発生するため、スレッドの状態を常にチェックするコードを実装したくないと感じています。

(これはbackgroundworkerを使用すると簡単になることはわかっていますが、このスレッドをバックグラウンドにすることはできないため、このプロセスにbackgroundworkerは必要ありません)。

スレッドオブジェクトが完了したときにイベントをトリガーする方法はありますか?ThreadFinished()イベントを実行するための最良の方法は何ですか?スレッドが正常に完了した後、メインUIで実行する必要のあるコードがあります。

4

2 に答える 2

4

呼び出しGetAppUpdates()を行う新しい匿名メソッドと、更新が完了したことを通知するその他のメソッドを渡します。

Thread t = new Thread(new ThreadStart(() => { GetAppUpdates(); Completed(); }));
t.Start();

CompletedGetAppUpdates()メソッドが実行された後、メソッドが呼び出されます。

private void Completed()
{
   if (InvokeRequired)
   {
      Invoke((MethodInvoker)delegate() { Completed(); });
      return;
   }

   // update UI
}

ところで、これでうまくいきますが、BackgroundWorkerを使用することをお勧めします。このようなタスク用に設計されており、RunWorkerCompletedイベントハンドラーはUIスレッドで実行されます。これは非常に便利です。

于 2012-12-12T23:10:28.910 に答える
0

Taskスレッドの代わりにこれを書くことをお勧めします。完了時にUIを更新しているため、UIスレッドで実行されていることを確認する必要があります。これは継続を介して行うことができます:

Task task = Task.Factory.StartNew(() => GetAppUpdates());
task.ContinueWith(t => UpdateUserInterface(),
                     TaskScheduler.FromCurrentSynchronizationContext());
于 2012-12-12T23:13:55.833 に答える