2016-06-15 81 views
0

我正在通過TCP/IP讀取一些數據,並且由於某種原因沒有捕獲到超時異常。任何想法這裏有什麼不對?C#超時異常未捕獲

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(); 
} 
+0

這是一個錯字'抓(TimeoutException異常)'它shoulfd是'趕上(TimeoutException異常前)' – Mairaj

+2

@MairajAhmad你並不需要指定'ex'除非你打算使用它 – dotnetom

+1

@dotnetom感謝您指出 – Mairaj

回答

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呼叫,所以它可能會繼續讀取字節,並弄亂你的其他通信。所以我認爲它不適合你的情況。