2011-10-12 7 views
2

サーバに接続するためのタイムアウトパラメータを実装しようとしていますが、私は運があまりありません。ここに私のコードは次のとおりです。timeoutInMSが1022より大きい場合1022ミリ秒間このタスクを待つのはなぜうまくいくのですか?1023はAggregateExceptionを引き起こします。

client = new TcpClient(); 

Task task = Task.Factory.FromAsync(client.BeginConnect, client.EndConnect, host, port, null); 

bool taskCompleted = connectTask.Wait(timeoutInMS); 

if (taskCompleted) 
{ 
    // Do something with the establishment of a successful connection 
} 
else 
{ 
    Console.WriteLine("Timeout!"); 
} 

は残念ながら、AggregateExceptionは、この行にスローされます。

bool taskCompleted = connectTask.Wait(timeoutInMS); 

がれるtcpClientのタイムアウトプロパティは、任意の違いを作るようには見えなかったの調整します。

+0

集約の「InnerExceptions」とは何ですか? –

+0

@FrédéricHamidi: ''ターゲットマシンが積極的にそれを拒否したため、接続できませんでした127.0.0.1:8080 "' –

+0

タイムアウトが1023秒未満の場合、またはすべての場合に常に拒否された場合、接続は成功しますか? –

答えて

3

おそらくTaskが1022ミリ秒で結果を生成していない可能性があります。しかし、それより少し待って、SocketExceptionをキャプチャすることができたのはTcpClientです。

あなたの状況は、以下に類似している:あなたはsyncrhonous的にTcpClientを使用しているとき

var task = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(5000); 
    throw new Exception(); 
}); 

bool taskCompleted = task.Wait(4000); // No exception 
bool taskCompleted = task.Wait(6000); // Exception 

ところで、なぜあなたはFromAsync()を使用していますか?

+0

この例題は少し工夫されています。実際のコードでは、私はWaitを呼び出していないので、FromAsyncの呼び出しの後に 'task.ContinueWith(...);'を呼び出します。 Tasksでカスタムタイムアウトの実装を許可するソリューションを知っていますか? –

+0

@Ryan、[この質問](http://stackoverflow.com/q/4238345/464709)があなたにとって興味深いかもしれません。 –

+0

私はTPLでそれを行うエレガントな方法を知らない。しかし、一般的に実装されているのは、あなたがリクエストをした時間(おそらく 'StopWatch'?)を記録し、あなたのタスク継続の経過時間を取得することだと思います。経過時間があなたのタイムアウトより大きい場合は、要求を進めず、必要に応じて 'NetworkStream'を終了してください。 –

関連する問題