2

接続試行のタイムアウトを構成可能にする必要があるアプリケーションに取り組んでいます。

以下のコードを見ると、私がやろうとしていることがわかるでしょう: 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 ステートメントでラップできると思いますが、複数の呼び出し元を持つことができ、すべての呼び出し元が間違っているように見えます。

どうすればやりたいことを達成できますか?

4

1 に答える 1