上一个任务完成后调用异步方法

问题描述 投票:1回答:3

我最近了解了Task.ContinueWith,并正在尝试将其应用于我现有的一些代码中以提高性能。我有这样的东西:

        public static async Task<TResult> DoWork<T, TResult>(T value)
        {
            var fooResult = await Foo(value);
            return await Bar<TResult>(fooResult);
        }

        private static Task<MyClass> Foo<T>(T value)
        {
            return GetMyClassFromValueAsync(value);
        }

        private static Task<TResult> Bar<TResult>(MyClass myClass)
        {
            return myClass.DoOperationAsync();
        }

并且一直认为我可以通过执行以下操作来改善它:

        public static Task<TResult> DoWork<T, TResult>(T value)
        {
            return Foo(value).ContinueWith(fooResult => Bar<TResult>(fooResult.Result));
        }

我遇到的问题是,在这种情况下,ContinueWith返回Task<Task<TResult>>类型,因为它将我的异步调用包装在另一个任务中。我发现的唯一解决方案是执行以下操作:

        public static async Task<TResult> DoWork<T, TResult>(T value)
        {
            return await await Foo(value).ContinueWith(fooResult => Bar<TResult>(fooResult.Result));
        }

但是那看起来是错误的,迫使我等待它。有没有更好的方法来处理这种情况?

这些电话在幕后发生了很多事情,因此,如果我采用了错误的方法,或者我的直觉使我误入歧途,我应该坚持原来的方法,请让我知道为什么,这样我就可以学习和改进。谢谢!

c# asynchronous async-await task task-parallel-library
3个回答
1
投票

您非常亲密。您最后缺少UnWrap方法。


1
投票

您正在寻求将承诺链接在一起并返回最终结果,为此有一个扩展方法Unwrap


0
投票

Using ContinueWiht can be problematic,它不必要地复杂。

© www.soinside.com 2019 - 2024. All rights reserved.