1

System.Timers.Timer が与えられた場合、経過したイベント コードを実行しているワーカー スレッドがまだ実行されているかどうかをメイン スレッドから確認する方法はありますか?

つまり、タイマーまたはタイマーが実行されているメインのアプリ/サービス スレッドを停止する前に、ワーカー スレッドで実行されているコードが現在実行されていないことを確認するにはどうすればよいでしょうか?

これは、状態を使用してタイマーをスレッド化するためにタイマーを捨てることの問題ですか、それともスレッドを直接使用する時ですか?

4

2 に答える 2

1

あなたが求めていることを具体的に行うために作られているので、ManualResetEventを調べてください。

スレッドは新しいリセット イベントを作成し、メイン スレッドが実行中のスレッドがあるかどうかを確認するために使用できるアクセス可能なキューに追加します。

// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();

必要に応じてさらにサンプル コードを提供することもできますが、基本的には、1 年ほど前にこれを行う必要があったときに読んだいくつかの記事からコピーしただけです。


言い忘れましたが、タイマーが起動したときに取得するデフォルトのスレッドにこの機能を追加することはできません。そのため、タイマー ハンドラーを非常に無駄のないものにし、新しいワーカー スレッドを準備して開始するだけのことを行う必要があります。

...
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate),
  myCustomObjectThatContainsAResetEvent);
于 2008-10-29T07:06:18.823 に答える
0

すぐに使えるソリューションの場合、方法はありません。主な理由は、コールバックを実行しているコードが完了した場合でも、TimerCallback 関数を実行しているスレッドがまだ生きている可能性が高いためです。TimerCallback は、ThreadPool からのスレッドによって実行されます。タスクが完了すると、スレッドは終了しませんが、代わりに次のスレッド プール タスクのキューに戻ります。

これを機能させるには、操作が完了したことを検出するために、スレッドセーフなシグナル伝達の方法を使用する必要があります。

タイマーのドキュメント

于 2008-10-29T05:56:54.580 に答える