接続試行のタイムアウトを構成可能にする必要があるアプリケーションに取り組んでいます。
以下のコードを見ると、私がやろうとしていることがわかるでしょう: 20 ミリ秒待ち (現時点ではハードコードされています)、接続が確立された場合は、onConnected コールバック アクションを true で呼び出します。それ以外の場合は false (たとえば、タイムアウトが発生した場合)
internal void Connect(Action<bool> onConnected)
{
Func<AsyncCallback, object, IAsyncResult> beginConnect =
(callback, s) =>
{
var asyncResult = _socket.BeginConnect(Endpoint, callback, s);
var success = asyncResult.AsyncWaitHandle.WaitOne(20, true);
if(!success) throw new TimeoutException("Connection timeout");
return asyncResult;
};
var task = Task.Factory.FromAsync(beginConnect, _socket.EndConnect, this);
task.ContinueWith(t => onConnected(true), TaskContinuationOptions.NotOnFaulted)
.ContinueWith(t => onConnected(false), TaskContinuationOptions.OnlyOnFaulted);
task.ContinueWith(t => onConnected(false), TaskContinuationOptions.OnlyOnFaulted);
}
問題は、beginConnect 関数のタイムアウト例外が原因で、コールバックが呼び出されないことです。Connect メソッドの呼び出し元で、呼び出しを tyr-catch ステートメントでラップできると思いますが、複数の呼び出し元を持つことができ、すべての呼び出し元が間違っているように見えます。
どうすればやりたいことを達成できますか?