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
)。
ここで何か不足していますか?