私が開発しているアプリケーションでは、単純にそこに座ってログデータを表示するメインフォームと、自律的にループを実行するワーカースレッドがあります。スレッドを正常にシャットダウンする
ご覧のとおり、フォームが閉じられるたびに、ワーカースレッドを停止する必要があります。労働者は、次のようになります。あなたが見ることができるように
public class MyWorker
{
public String Running { get; set; }
public MyWorker()
{
Running = true;
}
public void MainLoop()
{
while (Running)
{
DoExtensiveWork1();
if (!Running) return;
DoExtensiveWork2();
if (!Running) return;
DoExtensiveWork3();
if (!Running) return;
DoExtensiveWork4();
if (!Running) return;
DoExtensiveWork5();
if (!Running) return;
// We have to wait fifteen minutes (900 seconds)
// before another "run" can be processed
for (int i = 0; i < 900; i++)
{
Thread.Sleep(1000);
if (!Running) return;
}
}
}
}
が、私はスレッドが連続した作業の操作を切り替える際に停止することができるようにしたいが、ない場合の動作範囲内。操作(DoExtensiveWorkN
)が終了すると、その状態と結果はディスクまたはデータベースで保持されるため、操作の進行中に終了する(たとえば、Thread.Abort
など)はオプションではありません。
Running
に設定されていることを検出する前にスレッドがアイドル状態にならないように、特に私はこのコードを見て、特に1秒間スリープする "待機ループ" false
。
私はむしろ、仕事を終えるとすぐにメインループを停止するために何らかのイベントをスローすることができます。
これを行う方法を正しい方法で教えてもらえますか、スレッドが誤解されているために全面的な書き換えが必要な場合は、その原則が説明されている場所を教えてください。
タイマーは主な問題を解決しません。フォームが閉じられても作業を続行したくないので、チェックを続けるためにたくさんのコードを追加したくありません。 – CodeCaster
@コードキャスター:ああ、私は誤解していました。「スレッドが実行されている間に終了する(例えば、Thread.Abortなど)はオプションではありません」と誤解されていました。私の思想は一連のアクションを使用していましたが、イリジウムは私にそれを打ち負かしました。私はまだ15分待ってもタイマーを好む。 :) – Chris
私はそれをもっとはっきりと説明できました。しかし、提案をありがとう。 :-) – CodeCaster