Я пытаюсь написать метод расширения для System.Net.WebSocket, который превратит его в IObserver с помощью Reactive Extensions (Rx.NET). Вы можете увидеть код ниже:
public static IObserver<T> ToObserver<T>(this WebSocket webSocket, IWebSocketMessageSerializer<T> webSocketMessageSerializer)
{
// Wrap the web socket in an interface that a little easier to manage
var webSocketMessageStream = new WebSocketMessageStream(webSocket);
// Create the output stream to the client
return Observer.Create<T>(
onNext: async message => await webSocketMessageStream.WriteMessageAsync(webSocketMessageSerializer.SerializeMessage(message)),
onError: async error => await webSocketMessageStream.CloseAsync(WebSocketCloseStatus.InternalServerError, string.Format("{0}: {1}", error.GetType(), error.Message)),
onCompleted: async () => await webSocketMessageStream.CloseAsync(WebSocketCloseStatus.NormalClosure, "Server disconnected")
);
}
Этот код работает, но меня беспокоит использование async/await внутри onNext, onError и onCompleted lambdas. Я знаю, что это возвращает асинхронную lambda, которая нахмурилась (и иногда вызывает проблемы, с которыми я уже столкнулся).
Я читал документацию Rx.NET, а также сообщения в блогах по всему Интернету, и я не могу найти подходящий способ (если есть) использовать метод async/await в IObserver. Есть ли правильный способ сделать это? Если нет, то как я могу обойти эту проблему?