gpt4 book ai didi

c# - 如何将 Task 转换为 Task

转载 作者:IT王子 更新时间:2023-10-29 04:20:39 24 4
gpt4 key购买 nike

因为 C# 的 Task 是一个类,你显然不能转换 Task<TDerived>Task<TBase> .

但是,您可以:

public async Task<TBase> Run() {
return await MethodThatReturnsDerivedTask();
}

有没有我可以调用的静态任务方法来获得 Task<TDerived>本质上只是指向底层任务并转换结果的实例?我想要这样的东西:

public Task<TBase> Run() {
return Task.FromDerived(MethodThatReturnsDerivedTask());
}

有这样的方法吗?仅出于此目的使用异步方法是否有任何开销?

最佳答案

Does such a method exist?

没有。

Is there any overhead to using an async method solely for this purpose?

是的。但这是最简单的解决方案。

请注意,更通用的方法是 Task 的扩展方法例如 Then . Stephen Toub 探索了这个 in a blog post我最近 incorporated it into AsyncEx .

使用 Then ,您的代码将如下所示:

public Task<TBase> Run()
{
return MethodThatReturnsDerivedTask().Then(x => (TBase)x);
}

另一种开销稍低的方法是创建您自己的 TaskCompletionSource<TBase>并用派生结果完成它(在我的 AsyncEx 库中使用 TryCompleteFromCompletedTask):

public Task<TBase> Run()
{
var tcs = new TaskCompletionSource<TBase>();
MethodThatReturnsDerivedTask().ContinueWith(
t => tcs.TryCompleteFromCompletedTask(t),
TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}

或者(如果你不想依赖 AsyncEx):

public Task<TBase> Run()
{
var tcs = new TaskCompletionSource<TBase>();
MethodThatReturnsDerivedTask().ContinueWith(t =>
{
if (t.IsFaulted)
tcs.TrySetException(t.Exception.InnerExceptions);
else if (t.IsCanceled)
tcs.TrySetCanceled();
else
tcs.TrySetResult(t.Result);
}, TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}

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

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