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.
Ist das ein Tippfehler 'catch (Timeout)' es shoulfd sein 'catch (Timeout ex)' – Mairaj
@MairajAhmad Sie müssen nicht angeben 'ex', wenn Sie es planen – dotnetom
für @dotnetom Dank verwenden – Mairaj