Я хочу, чтобы в моей программе был создан специальный вид делегата, который при регистрации регистратора к нему я хочу проверить, если он уже вызван, и если это так - немедленно вызовите подписчика.Как создать событие, которое вызывает зарегистрированного слушателя, как только оно будет зарегистрировано, если событие уже было вызвано? (C#)
Глядя на него атомарно я смог добиться этого, используя следующие:
private bool _wasEventCalled;
private event Action _someEvent;
public event Action SomeEvent
{
add
{
if (value == null)
{
return;
}
// If already called, call immediatley
if (_wasEventCalled)
{
value(this);
return;
}
_someEvent += value;
}
remove
{
if (_someEvent == null)
{
return;
}
_someEvent -= value;
}
}
private void InvokeEvent()
{
_wasEventCalled = true;
_someEvent.Invoke();
}
Это прекрасно работает, но я искал способ, чтобы создать родовое событие, которое я могу повторно использовать - так как это это много кода для записи каждый раз, когда я хочу использовать это поведение.
'_someEvent.Invoke();' должен быть '_someEvent? .Invoke();' обрабатывать случай, когда нет обработчиков. Кроме того, этот код работает неправильно, если его вызывает несколько потоков; по-видимому, это не такая ситуация, с которой вам нужно обращаться, и только один поток, воздействующий на этот объект за раз. Это верно? – Servy
@Servy это был полу-псевдокод - мой вопрос больше о том, как я могу достичь этого в многоразовом режиме, если я хочу, чтобы это поведение происходило на нескольких событиях, а безопасность потоков не является проблемой. – Ron
удаляет ручки что-то что вам действительно нужно? – Servy