我确信之前已经提出这个问题,但我似乎无法用正确的方式来表达任何能够解决我问题的答案.
我有一个基类,它实现了一个返回任务的Save方法的接口:
public interface ICanSave
{
Task Save();
}
public class Base : ICanSave
{
public Task Save()
{
return Task.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
当然Save方法实际上会做一些事情,比如保存到数据库,这就是为什么它是一个Task,所以可以等待它.如果我有一个继承自基类的Foo类:
public class Foo : Base { }
Run Code Online (Sandbox Code Playgroud)
目前,您必须执行实例化并保存两个不同的步骤:
var foo = new Foo();
await foo.Save();
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够进行实例化并将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;
}
}
Run Code Online (Sandbox Code Playgroud)
那可以用来做:
var foo = await Helper<Foo>.Save(new Foo());
Run Code Online (Sandbox Code Playgroud)
这更像是我想要实现的结果,但它似乎相当麻烦,加上帮助器似乎是将Save保存到任务两次(一次用于原始Task,第二次用于帮助).
有没有更简单的方法来执行从任务到T的任务的转换?
我没有看到这样的帮助方法,但如果你真的想要你可以这样:
public static class Helper<T> where T : ICanSave {
public static async Task<T> Save(T obj) {
await obj.Save();
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |