21

別のスレッドがブール値を設定するまでスレッドを停止する必要があり、それらの間でイベントを共有したくありません

私が現在持っているのは、Sleepを使用した次のコードです(これが変更したいコードです)。

while (!_engine.IsReadyToStop())
{
    System.Threading.Thread.Sleep(Properties.Settings.Default.IntervalForCheckingEngine); 
}

何か案は?

物事を明確にするために編集:

私が所有していないクラスの_engineというオブジェクトがあります。変更できないので、イベントを共有したくありません。そのクラスのメソッドがtrueを返すまで待つ必要があります。

4

4 に答える 4

33

SpinWait.SpinUntilこのコードをどこに配置するかに関係なく、これが正しい答えです。SpinUntilは、「呼び出しの間に回転、降伏、およびスリープの素晴らしい組み合わせ」を提供します。

于 2015-12-11T23:08:27.763 に答える
12

を使用している場合はC# 4.0、次を使用できます。

Task t = Task.Factory.StartNew (() => SomeCall(..));
t.Wait();

Task.Waitメソッドを使用する。

複数のタスクを次々に実行する場合は、Task.ContinueWithを使用できます。

 Task t = Task.Factory.StartNew (() =>SomeCall(..)).
                                ContinueWith(ExecuteAfterThisTaskFinishes(...);
 t.Wait();
于 2012-09-13T18:05:52.720 に答える
4

として宣言する

 AutoResetEvent _ReadyToStop = new AutoResetEvent(false);

として使用します

 _ReadyToStop.WaitOne();

 _ReadyToStop.Set();

詳細については、.Netの同期プリミティブを参照してください。

于 2012-09-13T18:04:56.990 に答える
0

条件変数は、条件を待機するために使用できる同期プリミティブです。

.NETにはネイティブには存在しません。ただし、次のリンクは、SemaphoreSlim、AutoResetEvent、およびMonitorクラスに関して実装された条件変数クラスの100%マネージコードを提供します。これにより、スレッドは条件を待機できます。また、条件が満たされたときに1つ以上のスレッドをウェイクアップできます。さらに、タイムアウトとCancellationTokensをサポートします。

条件を待つには、次のようなコードを記述します。

object queueLock = new object();

ConditionVariable notEmptyCondition = new ConditionVariable();

T Take() {

  lock(queueLock) {

    while(queue.Count == 0) {

      // wait for queue to be not empty
      notEmptyCondition.Wait(queueLock);
    }

    T item = queue.Dequeue();

    if(queue.Count < 100) {

      // notify producer queue not full anymore
      notFullCondition.Pulse();
    }

    return item;
  }
}

次に、別のスレッドで、条件を待機している1つ以上のスレッドをウェイクアップできます。

lock(queueLock) {

  //..add item here

  notEmptyCondition.Pulse(); // or PulseAll
}
于 2018-03-01T13:01:07.023 に答える