我有一个方法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>
。是否有可能得到我的预期结果?
答案 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>
,其中T
为Task<MyTypeB>
。您在调试器中看到的内容:Task<Task<MyTypeB>>
。