我有一个winform应用程序。我的winforms将从经理类注册一个事件。当事件(由工作线程触发,例如通过tcp连接)调用所有事件处理程序,并且同时已注册的winform已关闭时,是否会发生竞争条件?
答案 0 :(得分:1)
你描述它的方式,我认为没有竞争条件的地方,只要所有事件都是在相同的主UI线程上获取和处理的。
表单可能会在为同一事件调用两个单独的事件处理程序之间关闭甚至处理,但我不会将其称为竞争条件。
已更新以更新问题。如果从工作线程触发事件,则也会在该线程上调用所有已注册的处理程序。同时,表格可以关闭。请注意,可以有效地退出进程并终止工作线程(当主UI线程的Application.Run
退出时,这由工作线程上的Thread.IsBackground
控制)。
死锁和竞争条件也有很多机会,具体取决于您在事件处理程序中实际执行的操作以及您与表单本身的通信方式(例如control.Invoke
或control.BeginInvoke
)。
答案 1 :(得分:0)
如果您的任何表单订阅SomeManager.SomeEvent
,而不是SomeManager
实例(或SomeManager
类型,如果事件是静态的),则会保留对表单的引用,并且表单可以'由GC收集。
当事件被触发时,将执行驻留在窗体中的事件处理程序。如果此时此表格已关闭,则无关紧要。此外,哪个线程执行事件处理程序无关紧要。
这里没有关于竞争条件的内容,但是你应该注意,在表单关闭后可以调用该处理程序。 IMO,正确的方法是在关闭表格之前取消订阅活动。