Begin/End スタイルのメソッドを使用して非同期ネットワーク I/O を実行しています。(実際には Azure Table Storage に対するクエリですが、それは問題ではないと思います。) を使用してクライアント側のタイムアウトを実装しましたThreadPool.RegisterWaitForSingleObject()
。私が知る限り、これはうまく機能しています。
ThreadPool.RegisterWaitForSingleObject()
は引数として取るためWaitHandle
、I/O 操作を開始してから を実行する必要がありThreadPool.RegisterWaitForSingleObject()
ます。これにより、待機を登録する前に I/O が完了する可能性が生じるようです。
簡略化されたコード サンプル:
private void RunQuery(QueryState queryState)
{
//Start I/O operation
IAsyncResult asyncResult = queryState.Query.BeginExecuteSegmented(NoopAsyncCallback, queryState);
//What if the I/O operation completes here?
queryState.TimeoutWaitHandle = ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, QuerySegmentCompleted, asyncResult, queryTimeout, true);
}
private void QuerySegmentCompleted(object opState, bool timedOut){
IAsyncResult asyncResult = opState as IAsyncResult;
QueryState state = asyncResult.AsyncState as QueryState;
//If the I/O completed quickly, could TimeoutWaitHandle could be null here?
//If so, what do I do about that?
state.TimeoutWaitHandle.Unregister(asyncResult.AsyncWaitHandle);
}
これを処理する適切な方法は何ですか?Unregister()
AsyncWaitHandle の処理について心配する必要はありますか? もしそうなら、それが設定されるのを待つかなり簡単な方法はありますか?