框架中是否有一种现有的类型,可以让我做一些类似下面的例子?基本上,我想要增加超时时间的能力。
MagicWaitHandle waitHandle;
Main()
{
var fooBar = new FooBar();
fooBar.OnEvent += HandleEvent;
fooBar.Start(); // starts new thread
waitHandle.WaitOne(new TimeSpan(0,1,0)); // suspend
}
HandleEvent(Foo f)
{
if(f.SomeCondition) waitHandle.ExtendWaitPeriodBy(new TimeSpan(0,1,0)); // extend
else if(f.OtherCondition) waitHandle.Set(); // signal
}发布于 2015-05-21 15:34:51
框架中没有任何东西能提供您所要求的内容。不过,您可以为WaitHandle编写一个装饰器,然后使用它。
下面的伪代码可以帮助您启动实现。
public class MagicWaitHandle : WaitHandle
{
private readonly WaitHandle inner;
public MagicWaitHandle(WaitHandle inner)
{
if (inner == null) throw new ArgumentNullException("inner");
this.inner = inner;
this.SafeWaitHandle = inner.SafeWaitHandle;
}
public override bool WaitOne(TimeSpan timeout)
{
if (!base.WaitOne(timeout) )
{
if (<needs Apply Extended Timeout>)
{
return base.WaitOne(extendedTimeSpan);
}
}
return false;
}
public override bool WaitOne(TimeSpan timeout, bool exitContext)
{
if (!base.WaitOne(timeout, exitContext))
{
if (<needs Apply Extended Timeout>)
{
return base.WaitOne(extendedTimeSpan, exitContext);
}
}
return false;
}
public void ExtendWaitPeriodBy(TimeSpan timeSpan)
{
//...
}
}确保在实现时考虑线程安全。一旦您完成了MagicWaitHandle的实现,您就可以使用它作为
MagicWaitHandle magicHandle = new MagicWaitHandle(new ManualResetEvent(false));
...
magicHandle.WaitOne(timeout);其他代码中的位置
magicHandle.ExtendWaitPeriodBy(extensionTimeout);https://stackoverflow.com/questions/30376525
复制相似问题