我相信这个问题以前已经被问过,但我好像无法用正确的措辞得到任何解决我的问题的答案。
我有一个基类,它实现了一个带有返回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();
然而,我希望能够通过表达式进行实例化和保存,并返回一个任务。我想出了这个助手:
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类型的任务?
Task.Run
,在这些情况下比ThreadPool.QueueUserWorkItem
更合适。 - CSharpie