未捕获C#超时异常

时间:2016-06-15 04:35:47

标签: c# timeout

我正在通过TCP / IP读取一些数据,并且由于某种原因没有捕获超时异常。任何想法在这里有什么问题?

declare @longAddress varchar(max)
set @longAddress = 'District ALBERT numero 1234 city CASABLANCA région de NORTH country MOROOCO '

--assuming regin follow city
select CHARINDEX('numero',@longAddress)-- this is how you get position of numero and region


--do a substring
select SUBSTRING(@longAddress,1,CHARINDEX('numero',@longAddress)-1) -- get the district
select SUBSTRING(@longAddress,charindex('city',@longAddress),charindex('région',@longAddress)-charindex('city',@longAddress)) -- get the city

--combine
select SUBSTRING(@longAddress,1,CHARINDEX('numero',@longAddress)-1) -- get the district
+SUBSTRING(@longAddress,charindex('city',@longAddress),charindex('région',@longAddress)-charindex('city',@longAddress)) -- get the city

这是超时处理

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)
{
}

1 个答案:

答案 0 :(得分:0)

这不是.NET事件的工作方式。他们不会打断一个线程;它们将在由它所定义的计时器类型确定的上下文中运行。在这种情况下(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调用,所以它可能会继续读取字节并弄乱你的其他通信。因此,我认为它不适合您的情况。