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;
        }
    }
}

c# SOUP库调用块

没有办法可靠地取消你正在运行的特定任务,你可以传入一个CancellationToken,但这需要长时间运行的操作_device.Initialize()来支持取消,从表面上看,它不支持。

仍然,有一种方法可以用Thread.AbortCancellationTokenSource做到这一点,但这可能会使系统和设备处于不稳定状态。看一下这个问题,看看如何做到这一点。