События довольно тяжелый вес для этого короля задач, особенно если частота высокая.
Хотя я не отвечаю на ваш вопрос напрямую, я хочу дать вам альтернативу решению, основанному на событиях:
Решение включает в себя потоки событий с использованием Rx Framework и предоставление и IObservable (T) вместо события.
Решение выглядит следующим образом: класс DataImporter
предоставит свойство IObservable<string>
, которое внутренне реализуется с помощью Subject<T>
, который будет использоваться для вызова событий.
public class DataImporter {
private Subject<string> _StatusSubject = new Subject<string>();
public IObservable<string> Status { get { return _StatusSubject; }
...
}
Как вызвать событие в потоке:
void Foo()
{
// Do some work
_StatusSubject.OnNext("Some work has been done!")
}
Как подписаться на поток событий:
var importer = new DataImporter();
importer.Status.Subscribe(message => Console.WriteLine(message));
Преимущество использования этого подхода заключается в том, что вы можете использовать операторы Linq для выполнения операций над потоком событий очень простым и понятным способом.
Пример:
// Filter the stream of events, only to show short messages
importer.Status
.Where (message => message.Length < 100)
.Subscribe(message => Console.WriteLine(message));
// Add a timestamp to status messages
importer.Status
.TimeStamp()
.Subscribe(timestamped => Console.WriteLine(String.Format("Time:{0} Message: {1}", timestamped.Timestamp, timestamped.Value)));
// Buffer status messages each 5 secconds and return a list of messages
importer.Status
.BufferWithTime(Timespan.FromSeconds(5))
.Subscribe(list => Console.WriteLine(Strin.Join(new[] {Environment.Newline}, list));
и многое другое ...