Async Callbacks在哪个线程上运行?

我正在进行几个HttpWebRequest.BeginGetResponse调用,并且在BeginGetResponse的回调方法中,我正在调用一个EventHandler。 在EventHandler中,有一些逻辑可以测试下载是否成功。 如果没有,它会尝试重新下载Html。 我注意到有很multithreading被生成,尤其是在出现错误时。 那么,Async Callbacks在哪个线程上运行?

无论如何我可以在原始线程上调用EventHandler吗? 如果那不可行,我可以在UI线程上调用它吗?

谢谢!

回调是在线程池线程上进行的。 .NET中没有任何机制可以在特定线程上运行代码。 这很难得到,你不能只是在线程繁忙时中断线程并让它运行一些代码。 这导致了锁定无法解决的可怕的重新入侵问题。

线程必须处于空闲状态,不能主动改变程序的状态。 有一种行为方式的线程,即Winforms或WPF应用程序中的UI线程。 这也是必须处理基本上线程不安全的对象的线程,任何与UI相关的东西。 这不是巧合。

两个类库都可以编组从工作线程到UI线程的调用,特别是帮助以线程安全的方式更新UI。 在Winforms中,您使用Control.Begin / Invoke(),在WPF中使用Dispatcher.Begin / Invoke()。 BackgroundWorker是一个方便的类,可以在不明确管理编组的情况下完成此任务。 但不适合I / O完成回调。

“在原始主题上”是什么意思? 哪个原创post? 您可以使用Control.BeginInvokeDispatcher.BeginInvoke Control.BeginInvoke送到UI线程。 你不能编组一个任意的线程 – 它必须有一个像消息泵等待工作的东西。

至于执行哪个线程HttpWebRequest异步回调 – 我希望是一个通用的线程池工作线程,或者可能是一个IO完成端口线程。

使用Begin / End Async模式,请注意,可以在调用它们的线程上完成多种任务。 当您调用BeginXXX时,它返回一个布尔值,表示该任务是否在调用线程上完成。

基本答案是,它可以是任何线程。

如果您使用的是WPF,则可以使用Dispatcher在UI线程上调用您的逻辑。

否则,(如果不在WPF中)您可以使用SyncrhronizationContext来完成同样的事情。