[英]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 模式編寫的,那將起作用。 但事實並非如此。 相反,它使用自己的訂閱模式,使用委托來觸發更新。
因此,您的選擇是:
使用這兩個選項,請務必處理“取消訂閱”邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.