Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public event EventHandler Foo = delegate {}
public void OnFoo()
{
Foo(this, EventArgs.Empty);
}
1. Это не очень красиво.
2. Используем не самый последний список подписчиков.
public static void Raise<T>(this EventHandler<T> evt, object sender, T args) where T : EventArgs
using System;
using System.Threading;
namespace ConsoleApplication25
{
class Program
{
static void Main(string[] args)
{
var example = new Example();
for (int i = 0; i < 10; i++)
{
int j = i;
example.Foo += (sender, eventArgs) =>
{
Thread.Sleep(100);
Console.WriteLine(j);
};
}
using (var disposable = new MyDisposable())
{
example.Foo += (sender, eventArgs) => disposable.Foo();
new Thread(() => example.OnFoo()).Start();
}
Console.WriteLine("Waiting...");
Console.ReadKey();
}
}
class Example
{
public event EventHandler Foo;
public void OnFoo()
{
EventHandler handler = Foo;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
class MyDisposable : IDisposable
{
private bool _disposed;
public void Dispose()
{
_disposed = true;
}
public void Foo()
{
if (_disposed)
throw new ObjectDisposedException("MyDisposable");
Console.WriteLine("Hello world!");
}
}
}
Вызываем обработчики событий потокобезопасно без лишнего присваивания в C# 6