c# SOUP库调用块
本文关键字:调用 SOUP | 更新日期: 2023-09-27 18:11:21
我们的c#代码调用库来初始化硬件设备,在某些情况下,如果硬件没有响应,调用可能会阻塞。为了使我们的代码超时,我考虑在任务中调用库函数,并在ManualResetEvent上使用带有超时的wait。如果等待返回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;
}
}
}
没有办法可靠地取消你正在运行的特定任务,你可以传入一个CancellationToken
,但这需要长时间运行的操作_device.Initialize()
来支持取消,从表面上看,它不支持。
仍然,有一种方法可以用Thread.Abort
和CancellationTokenSource
做到这一点,但这可能会使系统和设备处于不稳定状态。看一下这个问题,看看如何做到这一点。