c# – 创建一个异步方法,包装订阅并在总线上发布

c# – 创建一个异步方法,包装订阅并在总线上发布,第1张

概述我有一种实现此接口的总线: public interface IBus{ void Publish<T>(T t); void Subscribe<T>(Guid subscriptionId, Action<T> action); void Unsubscribe<T>(Guid subscriptionId);} 以下是我如何使用它的示例: public void 我有一种实现此接口的总线:

public interface IBus{    voID Publish<T>(T t);    voID Subscribe<T>(GuID subscriptionID,Action<T> action);    voID Unsubscribe<T>(GuID subscriptionID);}

以下是我如何使用它的示例:

public voID Printname(){    IBus bus = new Bus();    var ID = GuID.NewGuID();    bus.Subscribe<ReplyUsername>(ID,replyUsername =>    {        bus.Unsubscribe<ReplyUsername>(ID);        Console.Writeline(replyUsername.Username);    });    Bus.Publish(new RequestUsername());}

这里是RequestUsername和ReplyUsername类:

public class RequestUsername {}public class ReplyUsername{    public string Username { get; set; }}

但是我想写一个扩展方法,用异步包装它:

public static class BusExtension{    public static async Task<TResult> Request<TRequest,TResult>(this IBus bus,TRequest request)    {        // Todo...    }}

这样我就能用这样的方式编写前面的代码:

public async voID Printname(){    IBus bus = new Bus();    var replyUsername = await bus.Request<RequestUsername,ReplyUsername>(new RequestUsername());    Console.Writeline(replyUsername.Username);}

我该怎么写而不是Todo?

解决方法 您可以使用taskcompletionsource< T>到 wrap anything成为await兼容的方法.

public static Task<TResult> Request<TRequest,TRequest request){  var tcs = new taskcompletionsource<TResult>();  var ID = GuID.NewGuID();  bus.Subscribe<TResult>(ID,result =>  {    bus.Unsubscribe<TResult>(ID);    tcs.TrySetResult(result);  });  bus.Publish(request);  return tcs.Task;}

但是请注意,您应该是ensure that the task is completed.如果总线有可能不响应请求,您应该有一个计时器或某些错误taskcompletionsource.

总结

以上是内存溢出为你收集整理的c# – 创建一个异步方法,包装订阅并在总线上发布全部内容,希望文章能够帮你解决c# – 创建一个异步方法,包装订阅并在总线上发布所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存