C#汤库调用块
我们的C#代码调用库来初始化硬件设备,在某些情况下,如果硬件没有响应,调用可能会阻塞。为了使代码超时,我考虑在任务中调用库函数,并在ManualResetEvent上使用带超时的等待。如果等待返回false,则设备未初始化。但这仍然会使任务运行(被阻止)。既然我不能将取消令牌传递到库代码中,那么我如何中止任务C#汤库调用块,c#,asynchronous,C#,Asynchronous,我们的C#代码调用库来初始化硬件设备,在某些情况下,如果硬件没有响应,调用可能会阻塞。为了使代码超时,我考虑在任务中调用库函数,并在ManualResetEvent上使用带超时的等待。如果等待返回false,则设备未初始化。但这仍然会使任务运行(被阻止)。既然我不能将取消令牌传递到库代码中,那么我如何中止任务 public class Foo { ManualResetEvent _event = new ManualResetEvent( false ); Device _de
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
,但这需要长时间运行的操作\u device.Initialize()
来支持取消,而从外观上看,它不支持取消
尽管如此,还是有一种方法可以通过
Thread.Abort
和CancellationTokenSource
来实现,但这会使系统和设备处于不稳定状态。请查看如何执行此操作。取消不可取消任务的问题可能重复并不是新问题。建议的副本是相同的基本问题。