Я заметил новую тенденцию в .NET 4.0, особенно в потенциально многопоточных сценариях, которая позволяет избегать событий и вместо этого предоставлять методы подписчика.
Например, System.Threading.Tasks.Task и Task<TResult>
имеют методы ContinueWith () вместо события Completed или Finished.Другим примером является System.Threading.CancellationToken : у него есть метод Register () вместо события CancellationRequested.
Хотя Task.ContinueWith () логичен, поскольку ондопускает простое объединение задач (было бы не так уж и элегантно с событиями), и что оно также позволяет Task<TResult>
наследовать от Task
(потому что таким образом, Task<TResult>
может обеспечить соответствующие перегрузки, которые были бы невозможны для события: если у вас есть событие EventHandler Finished в Task, все, что вы можете сделать, это создать еще одно событие, скажем, событие EventHandler<TaskResultEventArgs>
Finished in Task<TResult>
, что не очень приятно), но я не могу найтито же самое объяснение для CancellationToken.Register ().
Итак, каковы недостатки событий в подобных сценариях?Должен ли я также следовать этой схеме?Чтобы уточнить, какой из следующих я должен выбрать?Когда я должен предпочесть одно другому?
public event EventHandler Finished;
// or
public IDisposable OnFinished(Action continuation)
Большое спасибо!