首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未捕获C#超时异常

未捕获C#超时异常
EN

Stack Overflow用户
提问于 2016-06-15 04:35:46
回答 1查看 1.7K关注 0票数 1

我正在通过TCP/IP读取一些数据,由于某种原因,超时异常不会被捕获。有什么好主意吗?

代码语言:javascript
复制
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)
{
}

这里是超时处理

代码语言:javascript
复制
private static Task HandleTimer()
{
    Console.WriteLine("timeout");
    throw new TimeoutException();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-15 12:29:22

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

看起来,您试图在不支持超时的API上强制超时。没有干净的方法可以做到这一点。因此,首先要做的是询问维护readBytes的人是否支持超时。

有一种方法可以像这样做“假超时”:

代码语言:javascript
复制
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调用,因此它可能会继续读取字节并破坏其他通信。所以我不认为它适用于你的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37826240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档