1

X分ごとにスレッドをディスパッチする必要があるC#プログラムがありますが、以前にディスパッチされたスレッド(X分から)が現在まだ実行されていない場合に限ります。

単純な古いタイマーだけでは機能しません(以前にディスパッチされたプロセスがまだ終了しているかどうかに関係なく、X分ごとにイベントをディスパッチするため)。

ディスパッチされるプロセスは、タスクの実行にかかる時間によって大きく異なります。1秒かかる場合もあれば、数時間かかる場合もあります。最後に開始したときからまだ処理中の場合は、プロセスを再開したくありません。

誰かが実用的なC#サンプルコードを提供できますか?

4

3 に答える 3

1

このシナリオではタイマーが機能すると思います。タイマーが経過すると、同期オブジェクトのロックを取得しようとします。それが成功した場合、それはそれの仕事を進めます。ロックの取得に失敗した場合は、最後のスレッドが終了していないことがわかっているため、戻ります。

.Net 4.0以降を使用している場合は、を使用できますMonitor.TryEnter(object, bool)

bool acquiredLock = false;
try
{
    Monitor.TryEnter(lockObject, ref acquiredLock);
    if (acquiredLock)
    {
        //do your work here
    }
}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}
于 2013-01-31T09:45:48.877 に答える
1

スレッドでwhile(True)ループを使用します。ループの先頭で開始時間を記録し、タスクを実行し、時間を再度取得し、どれだけの時間が経過したかを計算し、開始時間と比較します。これがX未満の場合は、差をmsとSleep()に変換します。

タイマー、継続的なスレッドの作成、同期、ポーリング、2つのタスクインスタンスが同時に実行される可能性はまったくありません。

于 2013-01-31T09:46:09.180 に答える
1

別のスレッドをアクティブ化する前に、スレッドが生きているかどうかを確認するだけです。Thread.IsAlive
を使用してこれを行います。

于 2013-01-31T09:44:02.550 に答える