1. ホーム
  2. c#

c#の待機パターンってもっといいのある?

2023-08-04 05:51:07

質問

何度かこのようなコーディングをしているのを見かけました。

for (int i = 0; i < 10; i++)
{
   if (Thing.WaitingFor())
   {
      break;
   }
   Thread.Sleep(sleep_time);
}
if(!Thing.WaitingFor())
{
   throw new ItDidntHappenException();
}

悪いコードのように見えますが、もっと良い方法があるのでしょうか / 悪いデザインの症状なのでしょうか?

どのように解決するのですか?

このパターンを実装するためのより良い方法は、あなたの Thing オブジェクトが、コンシューマが待機できるイベントを公開することです。 例えば ManualResetEvent あるいは AutoResetEvent . これにより、コンシューマ・コードは以下のように大幅に簡素化されます。

if (!Thing.ManualResetEvent.WaitOne(sleep_time)) {
  throw new ItDidntHappen();
}

// It happened

のコードは Thing 側のコードも、実際にはこれ以上複雑にはなっていません。

public sealed class Thing {
  public readonly ManualResetEvent ManualResetEvent = new ManualResetEvent(false);

  private void TheAction() {
    ...
    // Done.  Signal the listeners
    ManualResetEvent.Set();
  }
}