Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET窗口窗体事件(如按钮单击)是同步的还是异步的?_.net_Forms - Fatal编程技术网

.NET窗口窗体事件(如按钮单击)是同步的还是异步的?

.NET窗口窗体事件(如按钮单击)是同步的还是异步的?,.net,forms,.net,Forms,我的理解是,它们是同步的,但是在我目前正在处理的项目中,当我双击一个按钮时,它最终会调用该方法两次,但秒调用是在长时间运行的第一次调用返回之前进行的 我知道我可以通过在第一次单击时禁用按钮来防止这种情况,但我想知道它们是同步还是异步的 谢谢, Canice.这一切都取决于窗口窗体的设置和编程方式。如果UI在它自己的线程中运行,或者按钮单击被连接起来作为后台请求运行,那么您会将它们视为异步事件。但是,如果它们不是以这种方式连接的,您将看到它们是同步事件 因此,如果我们不了解更多有关此Windows

我的理解是,它们是同步的,但是在我目前正在处理的项目中,当我双击一个按钮时,它最终会调用该方法两次,但秒调用是在长时间运行的第一次调用返回之前进行的

我知道我可以通过在第一次单击时禁用按钮来防止这种情况,但我想知道它们是同步还是异步的

谢谢,
Canice.

这一切都取决于窗口窗体的设置和编程方式。如果UI在它自己的线程中运行,或者按钮单击被连接起来作为后台请求运行,那么您会将它们视为异步事件。但是,如果它们不是以这种方式连接的,您将看到它们是同步事件


因此,如果我们不了解更多有关此Windows窗体是如何编程的,答案是这取决于默认情况,而不是通常情况,尽管Windows消息泵的工作方式有时可能会模拟它。当然,这还取决于如何定义“同步”和“异步”

通常,当您单击按钮时,GUI线程通常不会返回,直到方法及其调用的任何同步方法完成。这就是为什么在事件处理程序中执行cpu密集型工作时UI会“冻结”的原因。

它们是同步的,但不是序列化的。有重新进入的可能性


听起来您的按钮点击处理程序直接或间接地运行嵌套消息循环。在这种情况下,可以在第一个处理程序返回之前再次调用该处理程序。

该表单非常标准,当我查看调试器中的线程列表时,事件处理程序调用位于主线程上。我在哪里可以检查按钮点击是否作为后台请求连接?首先,请求是否从调试器中看到的内容生成新线程?如果不是,那么就没有后台工作线程。不,我没有为处理事件创建新线程。但是,它使用一对AutoResetEvent与现有线程进行对话,一个用于指示新的“命令”已就绪,另一个用于指示已处理。我使用WaitOne(timeout)方法等待每个命令被处理/超时。线程持续运行,通过TCP向设备发送命令,但我不认为线程/自动恢复事件会导致问题,因为当收到第二次单击事件时,它们仍在等待响应-但我可能错了:(谢谢Stephen,这听起来像是个问题。在处理第一个事件之前禁用按钮是“标准”处理方法还是有更好的方法?这取决于“外观和感觉”用户界面所需的,以及按钮所代表的内容。在处理程序运行时禁用按钮是一种常见的方法;这是一种简单的解决方案,用户可以在网页中随时看到。或者,您可能希望显示一个模式“忙”对话框,如果你想禁用整个UI。或者-如果你不想禁用任何东西-你可以让按钮将“正在进行的任务”添加到UI中的任务列表中,这样用户就可以看到按钮做了什么,并看到任务何时完成。根据上面Stephen的回答,我需要知道的是它们是否序列化。