(Я знаю, что название звучит просто, но держись, наверное, это не вопрос, который вы так думаете.)
В VB.NET мне удалось написать пользовательские события. Например, у меня был отдельный поток, который периодически поднимал событие, и в этом случае графический интерфейс должен был быть обновлен. Я не хотел, чтобы занятый поток беспокоился об вычислениях пользовательского интерфейса, и я не хотел помещать Me.Invoke(Sub()...) в обработчик события, так как он также вызывался из потока графического интерфейса.
Я придумал этот очень полезный бит кода. В потоке 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
Теперь в С# я могу сделать так много:
public event EventHandler TestEvent
add
{
testEventDelegate = (EventHandler)Delegate.Combine(testEventDelegate, value);
}
remove
{
testEventDelegate = (EventHandler)Delegate.Remove(testEventDelegate, value);
}
}
Но где можно выполнять индивидуальное повышение?
EDIT:
Другие ответы сказали мне, что я не мог сделать это прямо на С#, но не объяснил, почему я не могу и почему я этого не хочу. Мне потребовалось некоторое время, чтобы понять, как С# события работали по сравнению с VB.NET. Я оставил мое собственное объяснение для других, у кого нет хорошего понимания этого, чтобы начать думать по правильным линиям.
Честно говоря, я так привык к шаблону OnTestEvent, что мне не совсем понравилась идея сделать его отличным от остальных вспомогательных методов.:-) Теперь, когда я понимаю обоснование, я вижу, что на самом деле это лучшее место для размещения этого материала.