1. ホーム
  2. c#

[解決済み] [Solved] .NETでスレッドの終了を待つには?

2022-02-18 21:46:05

質問

メインUIスレッドと同様に2つのスレッドを持つ必要がある場合、C#でスレッドを使用するのは初めてです。基本的に、私は次のようなものを持っています。

{{コード

では、本質的に、あるスレッドが終了するのを別のスレッドが待つようにするにはどうすればよいのでしょうか?これを行うための最良の方法は何でしょうか?

どのように解決するのですか?

5つの選択肢が表示されるのですが。

1. スレッド.ジョイン

Mitchの答えと同じです。しかし、これはあなたのUIスレッドをブロックしてしまいますが、あなたのためにタイムアウトが組み込まれています。


2. を使用します。 public void StartTheActions() { // Starting thread 1.... Thread t1 = new Thread(new ThreadStart(action1)); t1.Start(); // Now, I want for the main thread (which is calling `StartTheActions` method) // to wait for `t1` to finish. I've created an event in `action1` for this. // The I wish `t2` to start... Thread t2 = new Thread(new ThreadStart(action2)); t2.Start(); }

{{コード は WaitHandle jristaさんの提案のように

注意点としては、複数のスレッドを待機させたい場合です。 ManualResetEvent


WaitHandle

WaitHandle.WaitAll()

Main()

MTAThread

if

EventName(this,EventArgs.Empty)

public class Form1 : Form { int _count; void ButtonClick(object sender, EventArgs e) { ThreadWorker worker = new ThreadWorker(); worker.ThreadDone += HandleThreadDone; Thread thread1 = new Thread(worker.Run); thread1.Start(); _count = 1; } void HandleThreadDone(object sender, EventArgs e) { // You should get the idea this is just an example if (_count == 1) { ThreadWorker worker = new ThreadWorker(); worker.ThreadDone += HandleThreadDone; Thread thread2 = new Thread(worker.Run); thread2.Start(); _count++; } } class ThreadWorker { public event EventHandler ThreadDone; public void Run() { // Do a task if (ThreadDone != null) ThreadDone(this, EventArgs.Empty); } } }

public class Form1 : Form { int _count; void ButtonClick(object sender, EventArgs e) { ThreadWorker worker = new ThreadWorker(); Thread thread1 = new Thread(worker.Run); thread1.Start(HandleThreadDone); _count = 1; } void HandleThreadDone() { // As before - just a simple example if (_count == 1) { ThreadWorker worker = new ThreadWorker(); Thread thread2 = new Thread(worker.Run); thread2.Start(HandleThreadDone); _count++; } } class ThreadWorker { // Switch to your favourite Action<T> or Func<T> public void Run(object state) { // Do a task Action completeAction = (Action)state; completeAction.Invoke(); } } }

Interlocked.Increment(ref _count)


// Delegate example if (InvokeRequired) { Invoke(new Action(HandleThreadDone)); return; }

の答えは この質問 には、この方法のオプションが非常にわかりやすく書かれています。


間違ったスレッドでのデリゲート/イベント

イベント/デリゲート方式は、イベントハンドラを意味します。 メソッド はスレッド1/スレッド2 UIメインスレッドではない そのため、HandleThreadDoneメソッドの先頭でスイッチバックする必要があります。