首页 > 解决方案 > 上一个任务完成后调用异步方法

问题描述

我最近了解了 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));
        }

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

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

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

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

标签: c#asynchronousasync-awaittasktask-parallel-library

解决方案


你很亲密。你UnWrap最后错过了方法。

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

但实际上,您所做ContinueWith的并不比以前使用await. 我相信这await只是ContinueWith. 我个人觉得await更容易阅读。


推荐阅读