gpt4 book ai didi

c# - 如何将 Task 转换为 Task

转载 作者:行者123 更新时间:2023-11-30 20:16:56 45 4
gpt4 key购买 nike

我确定之前有人问过这个问题,但我似乎无法正确地表达问题以获得解决我问题的任何答案。

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

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();

但是我希望能够进行实例化并保存为表达式并返回一个任务。我想出了这个 helper :

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;
}
}

关于c# - 如何将 Task 转换为 Task<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47322977/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com