簡體   English   中英

如何轉換事件處理程序<mymessage>參數進入異步/等待?</mymessage>

[英]How to convert EventHandler<MyMessage> parameter into async/await?

我必須使用以下 API (基本上我必須在Stan訂閱主題/頻道/主題):

IStanSubscription Subscribe(string subject, StanSubscriptionOptions options, EventHandler<StanMsgHandlerArgs> handler);

我想將 EAP 模式轉換為 TAP 模式。 我所做的如下:

public Task<MyMessage> Subscribe(string subject)
{
    var tcs = new TaskCompletionSource<MyMessage>();

    _stanConnection.Subscribe(subject, GetStanSubscriptionOptions(), (sender, args) =>
    {
        string messageAsString = Encoding.UTF8.GetString(args.Message.Data, 0, args.Message.Data.Length);

        try
        {
            args.Message.Ack();

            MyMessage message = JsonConvert.DeserializeObject<MyMessage>(messageAsString);

            tcs.SetResult(message);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    });

    return tcs.Task;
}

第一條消息一切正常,但下一條消息拋出以下異常:

An attempt was made to transition a task to a final state when it had already completed

我閱讀了一些文章和主題,例如:

據我所知(我對 EventHandler 的高級應用不太了解)在這兩種情況下,他們直接從 class 訪問 EventHandler,在我的情況下 EventHandler 作為參數傳遞,我不確定如何取消訂閱。

干杯!

我想將 EAP 模式轉換為 TAP 模式。

如果 API 是用 EAP 模式編寫的,那將起作用。 但事實並非如此。 相反,它使用自己的訂閱模式,使用委托來觸發更新。

因此,您的選擇是:

  1. Map 將自定義訂閱模式轉換為標准的Observable 模式
  2. 構建一個緩沖區(例如System.Threading.Channels ),讓事件處理程序將項目添加到緩沖區,然后將它們作為異步 stream 使用。

使用這兩個選項,請務必處理“取消訂閱”邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM