【发布时间】:2012-02-18 15:39:49
【问题描述】:
(我知道标题听起来很简单,但请稍等——这可能不是您认为的问题。)
在 VB.NET 中,我能够编写自定义事件。例如,我有一个单独的线程,它会定期引发一个事件,并且在该事件上需要更新 GUI。我不想让繁忙的线程打扰 UI 计算,也不想将 Me.Invoke(Sub() ...) 放在事件处理程序中,因为它也是从 GUI 线程调用的。
我想出了这段非常有用的代码。 GUI 线程将设置 EventSyncInvoke = Me(主窗体)。然后线程可以像往常一样简单地引发事件 TestEvent,无需特殊代码,它会在 GUI 线程上无缝执行:
Private TestEventDelegate As EventHandler
Public EventSyncInvoke As System.ComponentModel.ISynchronizeInvoke
Public Custom Event TestEvent As EventHandler
AddHandler(value As EventHandler)
TestEventDelegate = [Delegate].Combine(TestEventDelegate, value)
End AddHandler
RemoveHandler(value As EventHandler)
TestEventDelegate = [Delegate].Remove(TestEventDelegate, value)
End RemoveHandler
RaiseEvent(sender As Object, e As System.EventArgs)
If EventSyncInvoke IsNot Nothing Then
EventSyncInvoke.Invoke(TestEventDelegate, {sender, e})
Else
TestEventDelegate.Invoke({sender, e})
End If
End RaiseEvent
End Event
现在在 C# 中我可以做到这一点:
public event EventHandler TestEvent
add
{
testEventDelegate = (EventHandler)Delegate.Combine(testEventDelegate, value);
}
remove
{
testEventDelegate = (EventHandler)Delegate.Remove(testEventDelegate, value);
}
}
但是自定义加注的能力在哪里?
【问题讨论】:
-
我开始注意到人们在阅读问题内容之前会做可能重复的事情(请这样做!)。 RaiseEvent 关键字可以定义两种截然不同的事物。