我有一个问题,我发现许多与多线程相关的类似问题,但是没有人链接到我的特定问题。

我有一个做某事的方法,但是当该方法被调用时,我不希望它返回,除非单击一个按钮。

因此,基本上,在方法结束时,我希望它保持原状并等待Button_Click事件完成,然后该事件应以某种方式“告诉”该方法继续。

目前,我已经通过在方法的末尾添加一个循环来做到这一点,如下所示:

while(someVariable){
  Thread.Sleep(10);
  Application.DoEvents();
}


然后,Button_Click事件将someVariable设置为false,然后循环停止。

当然,这看起来非常“不稳定”,并且使此循环每10毫秒运行一次似乎是巨大的浪费。

有什么办法可以正确地做到这一点吗?由于所讨论的方法与应用程序的其余部分在同一线程上运行,因此暂停该方法不会阻塞其他活动也很重要。

我需要这个的原因是因为从其他地方调用该方法时,该方法将绘制一些组件(包括两个按钮)。然后,用户单击其中的一个,然后该方法将返回不同的值,具体取决于单击了哪个按钮,并且调用它的程序要等到知道单击了哪个按钮后才能继续。因此我的程序将如下所示。

....
if( someMethod() == ButtonA ){
  //do the proper action if button 1 is clicked
}else{
  //do the proper action if button 2 is clicked
}


我希望这不会引起混淆。

最佳答案

假设这在UI线程中,则绝对不应该这样做。您说“重要的是,停止方法不要阻塞线程进行其他活动”-这基本上意味着您需要找到其他设计。如果UI线程“保持放置状态并等待Button_Click事件完成”,则不使用Application.DoEvents() hack就不能做任何其他事情。

相反,您应该在事件发生时回拨给原始呼叫者。公开一个呼叫者可以订阅的事件,并在按钮单击完成时引发该事件,或者让呼叫者传递一个委托以进行适当的呼叫。 (它们实际上是等效的,只是传播回调的方法不同。)

基本上,这就是WinForms(和其他富客户端UI)设计工作的方式-基本上是基于事件的模型。

10-05 23:46