2016-06-15 18 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) 
{ 
} 

とここだけの.NETイベントの働き方ではありません

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

これは、あなたがそれを – Mairaj

+2

ことshoulfdタイプミス 'キャッチ(TimeoutException)ですタイマーが経過すると例外がスローされ、タイマーを設定するルーチンでその例外をキャッチすると予想されますか? – dotnetom

+1

@dotnetomのおかげで使用することを計画している場合を除きあなたは 'ex'を指定する必要はありません@MairajAhmad'それは 'キャッチ(TimeoutExceptionのEX)' – Mairaj

答えて

0

を扱うタイムアウトです。彼らはスレッドを中断しません。タイマーの種類によって決まるコンテキストで実行されます。この場合(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コールを停止することはありませんので、それはおそらくあなたの他のバイトと混乱を読み続けますコミュニケーションだからあなたのシナリオでうまくいくとは思わない。

関連する問題