Имея следующий фрагмент кода, почему следующие подписи для события ведут себя по-разному?
Этот выдает исключение:
public event Action SomeEvent;
Этот не выдает исключение:
public event Func<Task> SomeEvent;
Это код для консольного приложения. Использование варианта Action для объявления события останавливает приложение и показывает трассировку стека.
internal static class Program
{
private static void Main()
{
var watcher = new Watcher();
watcher.Context.RaiseSomeEvent();
Console.ReadKey();
}
}
internal class Watcher
{
public Context Context { get; } = new Context();
public Watcher()
{
Context.SomeEvent += async () =>
{
Console.WriteLine($"Sleeping, current thread {Thread.CurrentThread.ManagedThreadId}");
await Task.Run(() => Thread.Sleep(1000));
Console.WriteLine($"Slept, current thread {Thread.CurrentThread.ManagedThreadId}");
throw new Exception();
};
}
}
internal class Context
{
public event Action SomeEvent;
//public event Func<Task> SomeEvent;
public void RaiseSomeEvent()
{
SomeEvent?.Invoke();
}
}
У меня было некоторое чтение, например this , но я этого не сделал нашел что-нибудь, что определило c события.