我想使用
然而,似乎来自
我已经按照以下方式设置了一个LINQPad概念验证:
我所期望的是类似于以下内容(假设回调函数运行时间足够长):
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
)。
我有遗漏什么吗?
ar.CompletedSynchronously
的值是什么? - dtbar.CompletedSynchronously
是true
。 - Matt MitchellGetHashCode
来完成您正在进行的操作;它不能保证在线程之间是唯一的。对于这个问题,有一个ManagedThreadId
可以使用。 - Michael Edenfield