2

私がこのコードを持っているとしましょう:

  public class MyAsyncHandler : IHttpAsyncHandler
    {
      public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
      {
        MyAsynchOperation asynch = new MyAsynchOperation(cb, context, extraData);
        asynch.StartAsyncWork();
        return asynch;
      }
     //...

さて、 ifは IO 操作なので、スレッドを結び付けていないMyAsynchOperation内部メソッド (APM) がある可能性があります。BeginFOO/EndFOO

操作が終了すると、スレッド プールからの新しい/同じスレッドが (完了ポートを介して) 応答を処理します。

大丈夫。

しかし、私が不思議に思うことの 1 つは、次のIAsyncResultプロパティがあることです。

System.Threading.WaitHandle AsyncWaitHandle { get; }

現在のスレッドをブロックWaitHadnleするメソッドがあることはよく知っています。 スレッドは、回転式改札口で(たとえば)を呼び出して待機またはブロックします。
WaitOne

そして、ここに私の質問があります:

質問1

  • IO に APM を使用していると仮定すると、スレッドのブロック/タイイングがない場合、MyAsynchOperation どのように(何のために) 使用されてます?waitHAndle

質問2

  • APMを使用していMyAsynchOperation ないと仮定すると、new Thread().start(do some calculation)後で呼び出す内部的に呼び出すのは私の実装だけですAsyncCallback's Callback----waithandleここでスレッドをブロックしますか?
4

1 に答える 1

2

#1:

ここでの要点はWaitOne、人々が完了を待つ同期コードを書けるようにすることです。などWaitOneのメソッドを使用する必要がない場合は、使用しないでください。それはいいです。WaitAny

#2:

どちらの場合も、専用スレッドを使用するか、他のコールバックを介して完了するかに関係なく、はい、スレッドをブロックします: を呼び出してブロックすることを要求したスレッドをブロックしますWaitOne。それを望まない場合: を呼び出さないでくださいWaitOne


Task<T>余談: 4.0 を指定したので、代わりに を使用してa を返す方が直感的であることに気付くかもしれませんTaskCompletionSource<T>。編集:メソッドを満たすため、これはオプションではないことに気付きましたIHttpAsyncHandler.BeginProcessRequest

于 2014-04-15T13:54:29.257 に答える