![](/img/trans.png)
[英]Is it possible to run async callbacks on the “main” thread in a console app?
[英]On which thread do Async Callbacks run?
我正在进行几个HttpWebRequest.BeginGetResponse
调用,并且在BeginGetResponse
的回调方法中,我正在调用EventHandler。 在EventHandler中,有逻辑可以测试下载是否成功。 如果不是,它将尝试重新下载HTML。 我注意到正在生成大量线程,尤其是在出现错误时。 那么,异步回调在哪个线程上运行?
无论如何,我可以在原始线程上调用EventHandler吗? 如果那不可能,我可以在UI线程上调用它吗?
谢谢!
“在原始线程上”是什么意思? 哪个原始线程? 您可以使用Control.BeginInvoke
或Dispatcher.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.