c# – 链接两个函数() – >任务和A->任务

c# – 链接两个函数() – >任务和A->任务,第1张

概述我不知道我是否以错误的方式思考TPL,但是我很难理解如何获得以下内容: 我有两个功能 Task<A> getA() { ... }Task<B> getB(A a) { ... } 这似乎经常发生:我可以异步获得一个A.并给定一个A,我可以异步获得一个B. 我不知道在TPL中将这些功能链接在一起的正确方法. 这是一个尝试: Task<B> Combined(){ Task<A> ta 我不知道我是否以错误的方式思考TPL,但是我很难理解如何获得以下内容:

我有两个功能

Task<A> getA() { ... }Task<B> getB(A a) { ... }

这似乎经常发生:我可以异步获得一个A.并给定一个A,我可以异步获得一个B.

我不知道在TPL中将这些功能链接在一起的正确方法.

这是一个尝试:

Task<B> Combined(){    Task<A> ta = getA();    Task<Task<B>> ttb = ta.ContinueWith(a => getB(a.Result));    return ttb.ContinueWith(x => x.Result.Result);}

ContinueWith是我感到困惑的地方.返回的类型是“双任务”,任务<任务< B>.这在某种程度上对我来说似乎是错误的.

更新2011-09-30:

巧合的是,我发现扩展方法TaskExtensions.Unwrap对任务< Task< T>>给出任务< T>.
所以直到我们得到C#5.0,我可以做ta.ContinueWith(a => …).在这样的情况下,继续本身返回一个任务的UnWrap().

解决方法 您的getB是否必须是返回任务< B>而不是B?

问题是ContinueWith是:

public Task<TNewResult> ContinueWith<TNewResult>(    Func<Task<TResult>,TNewResult> continuationFunction,CancellationToken cancellationToken)

所以在你的情况下,因为getB返回任务< B>,所以你传入一个Func<任务< A>任务< B>,所以TNewResult是任务< B>.

如果您可以更改getB,只需返回一个给定A的B,那么可以使用…或者您可以使用:

return ta.ContinueWith(a => getB(a.Result).Result);

那么lambda表达式将是类型,Func< Task< A>,B>所以ContinueWith将返回任务< B>.

编辑:在C#5中你可以很容易地写:

public async Task<B> CombinedAsync(){    A a = await getA();    B b = await getB(a);    return b;}

…所以这是“只是”一个问题,解决最终的结果.我怀疑它是这样的,但是错误处理:

public Task<B> CombinedAsync(){    taskcompletionsource<B> source = new taskcompletionsource();    getA().ContinueWith(taskA => {        A a = taskA.Result;        Task<B> taskB = getB(a);        taskB.ContinueWith(t => source.SetResult(t.Result));    });    return source.Task;}

那有意义吗?

总结

以上是内存溢出为你收集整理的c# – 链接两个函数() – >任务和A->任务全部内容,希望文章能够帮你解决c# – 链接两个函数() – >任务和A->任务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1260753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存