我正在进行多次HttpWebRequest.BeginGetResponse
次调用,而在BeginGetResponse
的回调方法中,我正在调用一个EventHandler。在EventHandler中,有一些逻辑可以测试下载是否成功。如果没有,它会尝试重新下载Html。我注意到有很多线程被生成,尤其是在出现错误时。那么,Async Callbacks运行在哪个线程上?
无论如何我可以在原始线程上调用EventHandler吗?如果那不可行,我可以在UI线程上调用它吗?
谢谢!
答案 0 :(得分:3)
“在原始帖子上”是什么意思?哪个原创帖子?您可以使用Control.BeginInvoke
或Dispatcher.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来完成同样的事情。