У меня есть вид автобуса, который реализует этот интерфейс:создать метод асинхронной, который оборачивает подписаться и публиковать на автобусе
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 никогда не будет неисправен? – Alon
Предполагая, что у вас есть какой-то код, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –
Спасибо, ты мне очень помог. – Alon