我们的C#代码调用库来初始化硬件设备,在某些情况下,如果硬件无法响应,则调用可能会阻塞。为了使我们的代码超时,我考虑在一个任务中调用库函数,并在ManualResetEvent上使用等待超时。如果等待返回false,则设备未初始化。但这仍然使任务运行(阻塞)。由于我无法将取消令牌传递到库代码中,我怎样才能中止任务?
public class Foo
{
ManualResetEvent _event = new ManualResetEvent( false );
Device _device = new Device();
public bool Initialize()
{
_event.Reset();
Task.StartNew( ()=>
{
if (_device.Initialize())
{
_event.Set();
}
} );
if ( !_event.Wait( 10000 ) )
{
// Device did not initialize. Stop task?
return false;
}
else
{
return true;
}
}
}
答案 0 :(得分:0)
无法可靠地取消您正在运行的特定任务,您可以传递CancellationToken
但需要长时间运行的操作_device.Initialize()
以支持取消它不会从它的外观来看。
但是,有一种方法可以使用Thread.Abort
和CancellationTokenSource
,但这可能会使系统和设备处于不稳定状态。请查看this question了解如何执行此操作。