繁体   English   中英

异步回调在哪个线程上运行?

[英]On which thread do Async Callbacks run?

我正在进行几个HttpWebRequest.BeginGetResponse调用,并且在BeginGetResponse的回调方法中,我正在调用EventHandler。 在EventHandler中,有逻辑可以测试下载是否成功。 如果不是,它将尝试重新下载HTML。 我注意到正在生成大量线程,尤其是在出现错误时。 那么,异步回调在哪个线程上运行?

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

谢谢!

“在原始线程上”是什么意思? 哪个原始线程? 您可以使用Control.BeginInvokeDispatcher.BeginInvoke编组到UI线程。 你不能元帅任意线程-它必须有类似的消息泵等待工作。

至于在哪个线程上执行HttpWebRequest异步回调-我希望可以是通用线程池工作线程,也可以是IO完成端口线程。

回调是在线程池线程上进行的。 .NET中没有机制可以使代码在特定线程上运行。 这很难实现,您不能只在线程繁忙时中断它并使其运行一些代码。 这会导致锁无法解决的可怕的重新进入问题。

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

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

请注意,使用“开始/结束异步”模式可以使许多任务在调用它们的线程上完成。 当您调用BeginXXX时,它将返回一个布尔值,该布尔值表示任务是否在调用线程上完成。

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

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

否则,(如果不在WPF中)您可以使用SyncrhronizationContext完成相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM