0

30 分以内に終了するアプリケーションがあります。アプリケーションのコンポーネントは、スレッドプールを使用して実行されます。

そう

//queue first all the components
//when the Collect method for each of the components finishes it will set the event
ManualResetEvent serverEvent = new ManualResetEvent(false);
sectionsCompleted.Add(serverEvent);
ThreadPool.QueueUserWorkItem(serverInfo.Collect,"ServerInfo ");

ManualResetEvent cpuEvent= new ManualResetEvent(false);
sectionsCompleted.Add(cpuEvent);
ThreadPool.QueueUserWorkItem(cpuInfo.Collect,"CPUInfo ");

//then wait for all the components to finish
WaitHandle.WaitAll(sectionsCompleted.ToArray());

そのため、ロジックは、ThreadPool 内のすべてのコンポーネントを呼び出し、ManualResetEvent クラスを使用して、コンポーネントが終了したことをメイン スレッドに通知することです。

ここで、ElapsedEvent Handler を使用して、コードが一定の時間枠 (たとえば 30 分) で正常に終了することを確認したいと考えています。したがって、30 分後にまだ実行中のスレッドがある場合は、それらを中止します。

だから私の質問はElapsedEventHandlerデリゲートがまったく呼び出されますか? または、メインスレッドはWaitHandle.WaitAll(sectionsCompleted.ToArray())を待ちますか?

一定の時間間隔の後にスレッドプール内のすべてのスレッドを停止するこの機能を実現できる他の方法はありますか?

4

2 に答える 2

1

ElapsedEventHandlerデリゲートはまったく呼び出されますか?

yes

メインスレッドは WaitHandle.WaitAll(sectionsCompleted.ToArray()) を待ちますか?

yes

ただし、.net 4.5 では、スレッド (cpuInfo.Collect など) でイベントハンドラーにシグナルを送信する必要があります。また、CancellationTokenSource(TimeSpan) を使用して、一定時間後にスレッドをキャンセルすることもできます。

ところで: WaitHandle.WaitAll(sectionsCompleted.ToArray()) を非 UI スレッドに配置する必要があります。そうしないと、UI がブロックされます。

于 2014-05-06T09:28:47.137 に答える