C# 在泵送windows消息时,是否有方法等待线程完成处理?

C# 在泵送windows消息时,是否有方法等待线程完成处理?,c#,.net,vb.net,multithreading,C#,.net,Vb.net,Multithreading,我试图在GUI线程上使用AutoResteEvent.WaitOne(),希望它不会完全阻塞GUI线程,并允许GUI线程在等待信号时不断发送windows消息(类似于thread.Wait())。我知道这不是一个正确的假设 因此,我正在寻找一种方法,在GUI线程上等待一个线程完成运行(类似于使用AutoResetEvent.WaitOne()),但保持消息流。(请不要使用DoEvents()) 我想简短的问题是:在.NET中是否有一个等待,它在等待时会发送windows消息(尤其是“绘制”事件)

我试图在GUI线程上使用AutoResteEvent.WaitOne(),希望它不会完全阻塞GUI线程,并允许GUI线程在等待信号时不断发送windows消息(类似于thread.Wait())。我知道这不是一个正确的假设

因此,我正在寻找一种方法,在GUI线程上等待一个线程完成运行(类似于使用AutoResetEvent.WaitOne()),但保持消息流。(请不要使用DoEvents())


我想简短的问题是:在.NET中是否有一个等待,它在等待时会发送windows消息(尤其是“绘制”事件)?我不知道您要求什么。AFIK(据我所知),您需要启动第二个后台任务或线程,等待AutoResetEvent在后台线程和UI线程中触发。一旦启动任务或第二个线程,请退出您的方法,以便它可以自由地执行您所说的“消息泵送”工作


因此,在这种情况下,一旦触发自动resetEvent,后台线程就需要完成您的处理,以继续处理。

我不知道您要求什么。AFIK(据我所知),您需要启动第二个后台任务或线程,等待AutoResetEvent在后台线程和UI线程中触发。一旦启动任务或第二个线程,请退出您的方法,以便它可以自由地执行您所说的“消息泵送”工作


因此,在这种情况下,一旦触发了后台线程的AutoResetEvent,后台线程就需要完成您的处理以继续处理。

CLR有一种特殊的解决方法,用于在STA线程上调用WaitOne()。这是非法的,不允许阻止支持单元线程的线程。这很容易造成僵局。事实上,CLR将开始接管发送消息的职责,大致类似于。非常粗略

虽然这可以让UI线程的基本管道保持活动状态,但如果可以避免的话,这绝对不是你想要做的事情。奇怪的事情可能会发生,这与使用Application.DoEvents()没什么不同,尽管CLR代码确实试图将重新进入可能造成的损害降到最低

顺便说一句,他们是如何做到这一点的大秘密,在SSCLI20发行版中故意省略了它,否则它是CLR代码的一个非常完整的副本。克里斯·布鲁姆(Chris Brumme),以他惯常的方式让人摸不透,但他只是挥手,没有透露任何好的秘密。代码本身对反向工程有很大的抵抗力,它很大。唯一常见的迹象是从程序员那里找到的堆栈跟踪,这是一个很难解决的问题


换句话说,您正在调用一个高度未记录且不易理解的代码路径。不要这样做。这基本上是不必要的,您可以始终调用回UI线程,并在WaitOne()调用之后继续使用现在获得的代码。这很安全。

CLR有一个特殊的解决方法,可以在STA线程上调用WaitOne()。这是非法的,不允许阻止支持单元线程的线程。这很容易造成僵局。事实上,CLR将开始接管发送消息的职责,大致类似于。非常粗略

虽然这可以让UI线程的基本管道保持活动状态,但如果可以避免的话,这绝对不是你想要做的事情。奇怪的事情可能会发生,这与使用Application.DoEvents()没什么不同,尽管CLR代码确实试图将重新进入可能造成的损害降到最低

顺便说一句,他们是如何做到这一点的大秘密,在SSCLI20发行版中故意省略了它,否则它是CLR代码的一个非常完整的副本。克里斯·布鲁姆(Chris Brumme),以他惯常的方式让人摸不透,但他只是挥手,没有透露任何好的秘密。代码本身对反向工程有很大的抵抗力,它很大。唯一常见的迹象是从程序员那里找到的堆栈跟踪,这是一个很难解决的问题


换句话说,您正在调用一个高度未记录且不易理解的代码路径。不要这样做。这基本上是不必要的,您可以始终调用回UI线程,并在WaitOne()调用之后继续使用现在获得的代码。这是安全的。

这将取决于您所使用的异步支持的风格。它可能会调用回调,可能会触发事件,可能会返回
任务
,或者任何数量的其他选项。您需要使用它公开的任何内容,以便在异步操作完成时执行某些代码。但是,我可以使用哪个wait()来传输windows消息?您需要使用所使用的异步源提供的方法,正如我所说的。当该方法是异步的时,您不会阻塞线程,并且它能够继续发送消息。@Denis只需查看该方法的文档,就可以了解在操作完成时执行某些代码需要做些什么。它将提供某种方式。@Denis这正是C#5.0对
wait
所做的。这需要一个新的语言特性来完成。在拥有该语言功能之前,您需要自己实际编写异步代码。当然,
await
实际上并不是让所有东西都同步,它只是异步编程的一个新选项,看起来比其他异步范例更接近同步代码。这将取决于您所使用的异步支持的风格。它可能会调用回调,可能会触发事件,可能会返回
任务
,或者任何数量的其他选项。您需要使用它公开的任何内容,以便在异步操作完成时执行某些代码。b