我发现自己已经对这种类型的东西进行了几次编码。
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();
}
}