C#SOUP库调用块

时间:2014-07-04 09:27:01

标签: c# asynchronous

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

1 个答案:

答案 0 :(得分:0)

无法可靠地取消您正在运行的特定任务,您可以传递CancellationToken但需要长时间运行的操作_device.Initialize()以支持取消它不会从它的外观来看。

但是,有一种方法可以使用Thread.AbortCancellationTokenSource,但这可能会使系统和设备处于不稳定状态。请查看this question了解如何执行此操作。