c#超时例外未捕获

  • 本文关键字:超时 c# timeout
  • 更新时间 :
  • 英文 :


我正在通过TCP/IP读取一些数据,由于某种原因,未捕获超时例外。有什么想法在这里怎么了?

try
{
    Timer timer1 = new Timer(dcaika);
    timer1.Elapsed += async (sender, e) => await HandleTimer();
    timer1.Start();
    memoryRes = dc.readBytes(libnodave.daveFlags, 0, 180, 1, memoryBuffer);
    timer1.Stop();
}
catch (TimeoutException)
{
}

这是超时处理

private static Task HandleTimer()
{
    Console.WriteLine("timeout");
    throw new TimeoutException();
}

这不是。他们不会中断线程;它们将在由计时器类型确定的上下文中运行。在这种情况下(System.Timers.Timer),Timer.Elapsed事件处理程序将在线程池线程上调用。因此,它在与try/catch完全不同的线程上运行,这就是为什么它不起作用。

看来,您正在尝试强制不本地支持超时的API暂停。没有干净的方法可以做到这一点。因此,第一件事是询问任何维护readBytes的人以及时支持。

那里这样做"假时"这样的方法:

var timeoutTask = Task.Delay(dcaika);
var readTask = Task.Run(() => dc.readBytes(libnodave.daveFlags, 0, 180, 1, memoryBuffer));
var completedTask = await Task.WhenAny(timeoutTask, readTask);
if (completedTask == timeoutTask)
  ...
else
  ...

但是这种方法不会停止readBytes调用,因此它可能会继续读取字节并弄乱您的其他通信。因此,我认为它不适用于您的情况。

相关内容

  • 没有找到相关文章

最新更新