4

FtpWebRequest非同期呼び出し ( BeginGetResponse/ )を使用しようとしていますEndGetResponse

ただし、からのコールバックBeginGetResponseはアプリケーションと同じスレッドで実行されているようです。私が印象に残っていたときは、別の (およびスレッド プール) スレッドを使用していました。これは、続行する前に、アプリケーションがコールバック内でブロックされることを意味します。

次のようにLINQPadの概念実証をセットアップしました。

"Starting".Dump();
Thread.CurrentThread.GetHashCode().Dump(); 
Thread.CurrentThread.IsThreadPoolThread.Dump();

IAsyncResult result = request.BeginGetResponse((ar) => 
{
     "Inside Callback".Dump();
     Thread.CurrentThread.GetHashCode().Dump();
     Thread.CurrentThread.IsThreadPoolThread.Dump();
     var resp = request.EndGetResponse(ar);
     "Callback Complete".Dump();
}, null);

"After Callback".Dump();

これにより、出力が次のように出力されます。

Starting
33
False
Inside Callback
33
False
Callback Complete
After Callback

私が期待するのは次のようなものです(コールバックの実行に十分な時間がかかったと仮定して):

Starting
33
False
Inside Callback
44
True
After Callback // App continues despite callback running
Callback Complete

コールバックが同じアプリケーション スレッドで実行されているということは、コールバック内の何かに時間がかかる場合 (たとえばThread.Sleep、引数のために a を導入するなど)、アプリケーションがそこでブロックされることを意味します。これは、リクエストでタイムアウトを設定できないことを意味します(たとえば、を使用ThreadPool.RegisterWaitForSingleObject)。

ここで何か不足していますか?

4

2 に答える 2

5

BeginXXXメソッドによって非同期操作をすぐに完了できる場合、スレッドプールスレッドでコールバックを実行しませんが、IAsyncResult.CompletedSynchronouslyプロパティをに設定しtrue、コールバックを同期的に実行します。

于 2012-07-02T02:13:21.573 に答える
0

BeginGetResponseメソッドが呼び出し元スレッドのコンテキスト内でコールバックを呼び出すと仮定します

于 2012-07-02T02:06:14.803 に答える