如何异步消费ServiceStack的ServerEventsClient OnMessage

How to consume ServiceStack's ServerEventsClient OnMessage asynchronously

我正在寻找一种使这部分代码异步的方法。

var sse = new ServerEventsClient(apiUrl)
{
  OnMessage = HandleResponse
};

我在此处 https://docs.servicestack.net/csharp-server-events-client#using-c-asyncawait-friendly-apis 查看了“使用 C# Async/Await 友好 API”,我不确定所提供的代码是否仅适用于未来的一条消息或每一条消息都会到来。我将发送大量请求,我希望通过 SSE 获得服务器响应,因此我希望每个响应都得到处理。

OnMessage 是一个同步事件,一旦收到消息就会触发,它没有异步备用回调。

如果您想异步处理消息,您可以将生产者与其消费者分离,这可以使用 BlockingCollection 来实现,您可以在其中 SSE 客户端在消息发送后立即捕获消息,例如:

using var bc = new BlockingCollection<ServerEventMessage>();
using var sse = new ServerEventsClient(apiUrl) {
  OnMessage = bc.Add
};
await sse.Connect();
//...

然后您可以让多个同步和异步消费者按照自己的节奏处理消息,而不管使用 TakeTryTakeGetConsumingEnumerable API 接收消息的速度如何,例如:

await Task.Run(async () => {
    foreach (var msg in bc.GetConsumingEnumerable())
    {
        // handle msg
        await Task.Delay(100);
    }
});

当您想停止处理消息时(例如,在处置 ServerEventsClient 时),您可以通过以下方式通知和短路消费者:

bc.CompleteAdding();