4

タイマーがあり、間隔でいくつかの関数を呼び出しています。今、私はこのようなものを持っています:

private System.Timers.Timer timer;
private int sync;

void Start()
{
  timer = new System.Timers.Timer(interval);
  timer.Elapsed += new ElapsedEventHandler(Elapsed);
  timer.Enabled = true;
}

void Elapsed(object s, ElapsedEventArgs e)
{
  if (System.Threading.Interlocked.CompareExchange(ref sync, 1, 0) == 0)
  {
    Parallel.Invoke( () => Function1(), () => Function2(), () => Function3(),
                     () => Function4() );
  }
  sync = 0;
}

これは悪くありません。関数を並列に開始できますが、1 つの関数を 2 回以上実行することはできません (これが私が望む方法です)。問題はfunction4()、 my よりも時間がかかるとしましょうinterval。そのため、他の関数も待機する必要があります。そこを削除するsyncと、他の関数は待機しませんが、別のfunction4()呼び出しが別のスレッドで開始される可能性があります-1つの関数が2回実行されることは望ましくありません。助言がありますか?ありがとうございました

4

1 に答える 1

3

各機能を個別に追跡する必要があるため、すぐに開始できる機能と待機する必要がある機能を制御できます。

private AutoResetEvent f1 = new AutoResetEvent(true);
private AutoResetEvent f2 = new AutoResetEvent(true);
...

void Elapsed(object s, ElapsedEventArgs e)
{
    ...
    Parallel.Invoke(() => { f1.WaitOne(); Function1(); f1.Set(); },
                    () => { f2.WaitOne(); Function2(); f2.Set(); }
                    ...
    ...
}

このようなものは、すでに実行されている関数をブロックし、実行されていない他の関数を開始できるようにします。

于 2012-09-18T07:58:15.537 に答える