2016-06-15 5 views
0

Ich lese einige Daten über TCP/IP und aus irgendeinem Grund Timeout-Ausnahme wird nicht abgefangen. Irgendwelche Ideen, was ist hier falsch?C# Timeout Ausnahme nicht abgefangen

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

und hier ist Timeout

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

Ist das ein Tippfehler 'catch (Timeout)' es shoulfd sein 'catch (Timeout ex)' – Mairaj

+2

@MairajAhmad Sie müssen nicht angeben 'ex', wenn Sie es planen – dotnetom

+1

für @dotnetom Dank verwenden – Mairaj

Antwort

0

Handhabung Das ist einfach nicht die Art und Weise .NET Ereignisse arbeiten. Sie unterbrechen einen Thread nicht; Sie werden in einem Kontext ausgeführt, der von der Art des Timers bestimmt wird. In diesem Fall (System.Timers.Timer) wird der Ereignishandler Timer.Elapsed für einen Threadpool-Thread aufgerufen. Also, es läuft auf einem komplett anderen Thread als der try/catch, und deshalb wird es nicht funktionieren.

Offenbar versuchen Sie, eine Zeitüberschreitung für eine API zu erzwingen, die Timeouts nicht unterstützt. Es gibt keinen sauberen Weg, dies zu tun. Also, das erste, was zu tun ist, fragen Sie, wer unterhält readBytes für Timeout-Unterstützung.

Es ist ein Weg, „fake Timeouts“ wie dies zu tun:

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 
    ... 

Aber dieser Ansatz den readBytes Anruf nicht aufhören, so wird es wahrscheinlich auch weiterhin Bytes und mess up Ihre andere lesen Kommunikation. Also ich denke nicht, dass es für dein Szenario funktioniert.