从我对.NET的理解来看,如果我使用BackgroundWorker并为RunWorkerCompleted提供事件处理程序,则该事件处理程序将在调用RunWorkerAsync的同一线程上运行。如果我在代理上使用BeginInvoke来异步运行方法,并将AsyncCallback参数传递给BeginInvoke,那么有没有什么方法可以指定回调在调用BeginInvoke的同一线程上运行 - 或者对于任何线程?根据我的理解,回调将在线程池中的下一个可用线程上运行。这很好,但有没有一种方法可以在我想要的任何线程上的AsyncCallback中运行代码?我知道你可以在窗体或控件上使用BeginInvoke,并在创建UI元素的线程的回调函数中创建代码。但是如果我想在没有窗体或控件的非UI线程上运行代码呢?使用delegate.BeginInvoke时,可以指定运行AsyncCallback的线程吗?
回答
在要用作异步操作目标的线程上,CurrentDispatcher属性是一个System.Threading.Dispatcher对象,可用于强制在该线程上执行回调。
这是Control类用来实现BeginInvoke的基类。
有关在Windows窗体中使用此问题的问题。我不认为这会是一个问题,但如果你有一个表单,那么form.BeginInvoke是一个更好的选择。看起来,表单和WPF都使用相同的基类来处理invoke。 http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx
线程将永远是一个线程池线程,并且永远不会是一个UI线程。
顺便说一句,C#没有BackgroundWorker
类。 .NET的确如此。
谢谢。我不是故意暗示BackgroundWorker是C#特有的。我把它拿出来了。 – YWE
我做了一个搜索,最后我输入了Jon Skeet's site。有关线程如何与异步委托和回调协同工作的信息非常丰富。我会强烈推荐这个阅读。
Delegate.BeginInvoke将始终在ThreadPool中执行委托,并在执行委托的同一个线程上调用AsyncCallback。
你唯一的选择是重新调用您的特定线程回调:
AsyncCallback = delegate (IAsyncResult ar)
{
wathever.BeginInvoke(delegate
{
// Do your stuff...
};
};
您的意思是在调用BeginInvoke的同一个线程上调用AsyncCallback?这似乎与我从MSDN文档标题为“异步调用同步方法”(http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx)中得知的内容相反,它表示“如果启动异步调用不需要是处理结果的线程,您可以在调用完成时执行回调方法。“ – YWE
不,我的意思是,当您从线程A调用Delegate.BeginInvoke时,此代理将在ThreadPool中的线程B上执行,然后在线程B上调用AsyncCallback。 –
True。我只是验证它。我不认为他们在MSDN文档中说明了这一点。 – YWE
- 1. JPA:可以在运行时指定JPA提供程序吗?
- 2. 主线程:可以运行的程序可以被抢占吗?
- 3. 使用sequelize.col时可以指定表吗?
- 4. 我可以在java中的线程中运行线程吗?
- 5. 可以使用Vaadin + Tomcat webapp连续运行线程吗?
- 6. 我可以找出使用Eclipse运行哪个线程吗?
- 7. Java程序运行时可以再次使用命令行吗?
- 8. 我可以在运行时指定maven project.artifactId吗?
- 9. 我可以在运行时指定动态数据源吗?
- 10. 我可以从命令行运行指定的Maven执行吗?
- 11. C#Delegate.BeginInvoke()和线程ID
- 12. 以指定的最大运行时间运行外部程序
- 13. 设计使用mpi的程序可以使用gpu运行吗?
- 14. 我可以在'puppet apply'运行时指定puppet的根执行目录吗?
- 15. Delegate.BeginInvoke回调阻塞调用线程?
- 16. AsyncCallback可以使用非静态代理吗?
- 17. 两个线程可以使用相同的线程程序吗?
- 18. 我们可以在Ruby中并行运行多线程吗?
- 19. 我可以指定一个始终运行的Makefile配方吗?
- 20. 我可以多次运行相同的线程吗?
- 21. 我可以修改主线程的运行方法吗
- 22. GTK的主循环可以从辅助线程运行吗?
- 23. 这是使用可运行线程创建线程的gud实践吗?
- 24. 如果运行时间过长,我可以使用executorservice杀死一个特定的线程吗?
- 25. GPU可以用来运行在CPU上运行的程序吗?
- 26. 我可以使用Zookeeper来运行我的应用程序吗?
- 27. 使用AddHandler时可以动态指定事件的类型吗?
- 28. 我可以使用useLegacyV2RuntimeActivationPolicy运行scriptcs吗?
- 29. sqoop可以不使用hadoop运行吗?
- 30. 您可以使用JRockit运行glassfish吗?
+1的CurrentDispatcher财产... – IAbstract
System.Windows.Threading.Dispatcher是WPF特定的,没有与调用Delegate.BeginInvoke的AsyncCallback的线程有关的任何事情。 –
@Jeff:它提供了一个备用的BeginInvoke方法来允许定位回调。据我所知,这是他真正想要的,只是在提问时混淆了他的术语。 –