我发现自己已经对这种类型的东西进行了几次编码。

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

它看起来像是不良代码,是否有更好的方法可以做到?这是不良设计的征兆吗?

最佳答案

实现此模式的一种更好的方法是让Thing对象公开使用者可以等待的事件。例如ManualResetEventAutoResetEvent。这极大地简化了您的使用者代码,如下所示

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();
  }
}

09-11 18:50