为什么ContinueWith返回Task <task <x>&gt;

时间:2018-06-06 19:07:11

标签: c# task

我有一个方法GetSomethingAsync,即return Task<MyTypeA>.Run(() => GetSomething());

我有另一种方法GetSomethingElseAsync,即return Task<MyTypeB>.Run(() => GetSomethingElse());

我希望第二个任务有条件地运行,基于第一个任务,所以我有

var task1 = GetSomethingAsync();
var task2 = task1.ContinueWith(x => x.Result == null ? Task.FromResult(null) : 
GetSomethingElseAsync();

task2编译为Task<Task<MyTypeB>>。我期待Task<MyTypeB>。是否有可能得到我的预期结果?

2 个答案:

答案 0 :(得分:1)

假设

match.Groups[2].Value

使用async定义并返回var task1 = GetSomethingAsync();

ContinueWith()的签名是

Task<T>

现在关注你的lambda结果:

public Task<TResult> ContinueWith<TResult>(
  Func<Task, TResult> continuationFunction
)

读取类似的内容,如果任务的结果为null,则返回一个Task(Task.FromResult)。

所以x => x.Result == null ? Task.FromResult(null) Func<Task, TResult>TResult,好像lambda写成:

Task<T>

现在Task<T> AnonymousFunction(task x) { return ... Task.FromResult(null); } 的结果是ContinueWith(),因为我们确定Task<TResult>TResult,结果类型是Task<T> }。

答案 1 :(得分:-1)

我相信这就是你要找的东西:

var task2 = task1.ContinueWith(completedTask => completedTask.Result == null ? (TypeB)null : GetSomethingElse());

task2现在应该是Task<MyTypeB>类型。

问题是task1.ContinueWith已经返回Task<T>。在您的陈述中,您还返回Task<T>,或更准确地说,Task<MyTypeB>。因此,task1.ContinueWith的调用结果为Task<T>,其中TTask<MyTypeB>。您在调试器中看到的内容:Task<Task<MyTypeB>>