我正在尝试使用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
),我的应用程序会在那里阻塞。这意味着我无法在请求上设置超时(例如,使用ThreadPool.RegisterWaitForSingleObject
)。
我在这里错过了什么吗?
答案 0 :(得分:5)
当BeginXXX方法可以立即完成异步操作时,它不会在线程池线程上运行回调,而是将IAsyncResult.CompletedSynchronously Property设置为true
并同步执行回调。 / p>
答案 1 :(得分:0)
我假设BeginGetResponse方法在调用者线程的上下文中调用回调