簡體   English   中英

如何將任務轉換為任務 <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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM