Async Callbacks在哪个线程上运行?

时间:2011-04-03 17:08:54

标签: c# multithreading asynchronous httpwebrequest

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

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

谢谢!

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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