gpt4 book ai didi

c# - 让一种方法等待特定事件完成

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:14 25 4
gpt4 key购买 nike

我有一个问题,我发现了很多与多线程相关的类似问题,但没有人与我的具体问题相关联。

我有一个方法可以做一些事情,但是当调用该方法时,我不希望它在单击按钮之前返回。

所以基本上,在方法结束时,我希望它留在原处并等待 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,它就无法做任何其他事情。

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

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

关于c# - 让一种方法等待特定事件完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3820444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com