![](/img/trans.png)
[英]How to convert an IEnumerable<Task<T>> to IObservable<T>
[英]How to convert a Task into a Task<T>?
我敢肯定这已经被问过了,但是我似乎无法正确表达问题的意思,以获取解决我问题的任何答案。
我有一个基类,该基类使用可返回Task的Save方法实现接口:
public interface ICanSave
{
Task Save();
}
public class Base : ICanSave
{
public Task Save()
{
return Task.CompletedTask;
}
}
当然,Save方法实际上会执行某些操作,例如保存到数据库,这就是为什么它是Task的原因,因此可以等待它。 如果我有一个从基类继承的Foo类:
public class Foo : Base { }
当前,您必须执行实例化并保存两个不同的步骤:
var foo = new Foo();
await foo.Save();
但是,我希望能够将实例化和另存为表达式,并且还返回Task。 我想出了这个助手:
public static class Helper<T> where T : ICanSave
{
public static Task<T> Save(T obj)
{
var source = new TaskCompletionSource<T>();
ThreadPool.QueueUserWorkItem(_ =>
{
obj.Save();
source.SetResult(obj);
});
return source.Task;
}
}
然后可以用来执行以下操作:
var foo = await Helper<Foo>.Save(new Foo());
这更像是我要达到的结果,但它看起来很麻烦,而且助手似乎两次将“保存到任务”推入一次(原始任务一次,而助手中第二次)。
有没有更简单的方法可以完成从任务到任务T的转换?
我看不到这种辅助方法的要点,但是如果您真的想要,可以这样:
public static class Helper<T> where T : ICanSave {
public static async Task<T> Save(T obj) {
await obj.Save();
return obj;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.