Если вам не требуется очень точный контроль за потоками, вы можете вместо этого использовать BackgroundWorker .Он обрабатывает все межпоточные коммуникации для вас.Вы в основном помещаете свой фоновый код в его обработчик событий DoWork, а затем передаете данные обратно в поток пользовательского интерфейса через события ProgressChanged и RunWorkerCompleted.Ссылка выше содержит полный пример того, как ее использовать.
Но в целом, простое добавление обработчиков событий и создание событий является поточно-ориентированным, если вы следуете некоторым основным рекомендациям.Однако обработчик события будет вызываться в том же потоке, что и код, который вызывает событие.Код обработки событий, возможно, не ожидает вызова в фоновом потоке, поэтому для этого пригодится BackgroundWorker.
Ниже приведен очень простой каркас класса, который генерирует событие в поточно-ориентированном виде.Является ли код, который обрабатывает событие, потокобезопасным, - это совсем другой вопрос.
class MyClass {
public event EventHandler SomethingHappened;
protected virtual void OnSomethingHappened(EventArgs e) {
EventHandler handler = SomethingHappened;
if (handler != null) {
handler(this, e);
}
}
public void DoSomething() {
OnSomethingHappened(EventArgs.Empty);
}
}