Вам нужна перегрузка преобразования.Я закрываю каждый раз, когда просматриваю эту вещь:
IObservable<TEventArgs> Observable.FromEvent<TDelegate, TEventArgs>(
Func<Action<TEventArgs>, TDelegate> conversion,
Action<TDelegate> addHandler,
Action<TDelegate> removeHandler>
)
Так что в нашем случае TEventArgs
равно Exception
, а TDelegate
равно Func<Exception, Task>
, поэтому вам нужно преобразовать Action<Exception>
вFunc<Exception, Task>>
, другими словами: Func<Action<Exception>, Func<Exception, Task>>
.Я предполагаю, что преобразование выглядит следующим образом: a => e => {a(e); return Task.CompletedTask; }
.
System.Reactive нужна эта функция преобразования, потому что она должна подписаться на событие с соответствующим делегатом и каким-то образом подключить ваш код / код сантехнического приемника.,В этом случае a(e)
- это в основном RX-соединение, которое затем передает исключение для последующей обработки в реактивном конвейере.
Полный код:
class Program
{
static async Task Main(string[] args)
{
Program.Closed += Program.HubOnClosed;
Observable.FromEvent<Func<Exception, Task>, Exception>(
a => e => {a(e); return Task.CompletedTask; },
h => Program.Closed += h,
h => Program.Closed -= h
)
.Subscribe(e =>
{
Console.WriteLine("Rx: The connection to the hub has been closed");
});
Program.Closed.Invoke(null);
Program.Closed.Invoke(null);
}
private static Task HubOnClosed(Exception arg)
{
Console.WriteLine("The connection to the hub has been closed");
return Task.CompletedTask;
}
public static event Func<Exception, Task> Closed;
}