C#汤库调用块

C#汤库调用块,c#,asynchronous,C#,Asynchronous,我们的C#代码调用库来初始化硬件设备,在某些情况下,如果硬件没有响应,调用可能会阻塞。为了使代码超时,我考虑在任务中调用库函数,并在ManualResetEvent上使用带超时的等待。如果等待返回false,则设备未初始化。但这仍然会使任务运行(被阻止)。既然我不能将取消令牌传递到库代码中,那么我如何中止任务 public class Foo { ManualResetEvent _event = new ManualResetEvent( false ); Device _de

我们的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;
        }
    }
}

无法可靠地取消您正在运行的特定任务,您可以传入一个
CancellationToken
,但这需要长时间运行的操作
\u device.Initialize()
来支持取消,而从外观上看,它不支持取消


尽管如此,还是有一种方法可以通过
Thread.Abort
CancellationTokenSource
来实现,但这会使系统和设备处于不稳定状态。请查看如何执行此操作。

取消不可取消任务的问题可能重复并不是新问题。建议的副本是相同的基本问题。