如何将任务转换为任务<t>?

时间:2017-11-16 06:25:01

标签: c# task

我确定以前曾经问过这个问题,但我似乎没有说出正确的问题来获得解决我问题的任何答案。

我有一个基类,它实现了一个返回任务的Save方法的接口:

public interface ICanSave
{
    Task Save();
}

public class Base : ICanSave
{
    public Task Save()
    {
        return Task.CompletedTask;
    }
}

当然Save方法实际上会做一些事情,比如保存到数据库,这就是为什么它是一个任务,所以可以等待它。如果我有一个继承自基类的Foo类:

public class Foo : Base { }

目前,您必须进行实例化并保存两个不同的步骤:

var foo = new Foo();

await foo.Save();

但是我希望能够进行实例化并将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());

这更像是我试图实现的结果,但它看起来相当麻烦,加上帮助器似乎将Save保存到任务两次(一次用于原始任务,第二次用于帮助程序) )。

有没有更简单的方法来执行从任务到T的任务的转换?

1 个答案:

答案 0 :(得分:6)

我没有看到这种辅助方法的重点,但如果你真的想要,你可以这样:

public static class Helper<T> where T : ICanSave {
    public static async Task<T> Save(T obj) {
        await obj.Save();
        return obj;
    }
}