我必须使用以下 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
我阅读了一些文章和主题,例如:
- TaskCompletionSource 抛出“尝试将已完成的任务转换为最终状态”
- https://devblogs.microsoft.com/pfxteam/tasks-and-the-event-based-asynchronous-pattern/
据我所知(我对 EventHandler 的高级应用不太了解)在这两种情况下,它们都直接从类中访问 EventHandler,在我的情况下,EventHandler 作为参数传递,我不确定如何取消订阅。
干杯!