3

私は、かなり典型的な問題だと思うものに対して思いついた解決策を検証しようとしています。サービスを実行していますが、10 分ごとに何かを行う必要があります。私は次のようになりました:

private AutoResetEvent autoResetEvent = new AutoResetEvent(true);
private bool isRunning = true;

public void Execute()
{
    while(isRunning)
    {
       DoSomething();

       if(isRunning)
       {
         autoResetEvent.WaitOne(new Timespan(0, 10, 0));
       }
    }
}

public void Stop()
{
    isRunning = false;
    autoResetEvent.Set();
}

私が見ることができる差し迫った潜在的な問題は、別のスレッドによって呼び出される Stop() の isRunning 変更の周りでロックを行っていないことですが、本当に必要かどうかはわかりません。起こりうる最悪の事態は、1 サイクル余分に実行されることです。

それ以外に、このコードに明らかな問題はありますか? 私が知らないこの問題を解決するより良い方法はありますか?

4

4 に答える 4

7

System.Threading.Timer を使用してみることができます。

Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0))
于 2010-05-14T16:21:30.730 に答える
1

これは 10 分ごとに実行されるわけではありません。DoSomething迅速なプロセスであれば、10分ごとに非常に近くなります。次の実行は、DoSomething完了から 10 分後に行われます。

Quartz.Netのようなジョブ スケジューラを使用できます。

于 2010-05-14T16:24:19.997 に答える
0

より良い方法の 1 つは、Windows Server AppFabric のようなものを使用することです。これには、反復タスク、エラー処理、および管理が組み込まれています。必要な実際のコードを記述するだけです。残念ながら、今日は最先端ですが、この種の新しい開発にはこれを選択します。

于 2010-05-14T16:20:09.563 に答える
0

Windows Workflow Foundation の使用についてはどうですか? そのようなタスクに非常に向いていると思います。

プログラムを介して appruntime を開始し、WWF アプリに処理を任せることができます。

于 2010-05-14T16:23:07.330 に答える