链接异步方法

JT *_*ith 3 c# asynchronous async-await

我试图将我创建的一些异步方法链接在一起,我相信对于我如何工作有一些根本的误解

这是我的代码的表示:

public async Task<bool> LoadFoo()
{
    return await Foo.ReadAsync("bar").ContinueWith((bar) =>
    {
        Foo.ReadAsync("baz").ContinueWith((baz) =>
        {
            Foo.ReadAsync("qux").ContinueWith((qux) =>
            {
                return true;
            });

            return true;
        });

        return true;
    });
}

public void LoadEverything()
{
    LoadFoo().ContinueWith((blah) =>
    {
        OtherLoadMethod();
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我期待调用LoadEverything()时,LoadFoo("bar","baz"和"qux")中的所有ReadAsync方法都会运行并完成,并且在它们全部完成之后,在LoadEverything中的.Continue将运行这样,在"bar","baz"和"qux"ReadAsync方法完成之前,OtherLoadMethod()不会执行.

我实际看到的是LoadFoo被调用,然后在LoadFoo中获得最终完成之前,OtherLoadMethod开始运行(继续使用"qux"ReadAsync).

有人可以帮助澄清我的错误吗?为什么在ReadAsync("qux")完成并返回true之前,不会执行OtherLoadMethod?

Pet*_*iho 10

为什么在ReadAsync("qux")完成并返回true之前,不会执行OtherLoadMethod?

因为那是await有效的.您注册的延续只是:延续.它们不是在当前方法中同步执行的.您告诉框架当前任务完成时,应该执行继续.Task返回的对象ContinueWith()允许您在发生时观察完成情况.Task如果ContinueWith()方法被阻塞直到执行继续,则甚至不需要返回对象.

同样,Task<bool>您的LoadFoo()方法返回表示方法的整体完成,包括await...ContinueWith()您返回的方法.该方法在完成延续之前返回,并且如果需要等待继续完成,则调用者应该使用返回的任务.

所有这一切,我不明白你为什么一开始使用ContinueWith().你显然可以访问await,这是处理延续的现代,惯用的方式.恕我直言,你的代码看起来应该是这样的(不清楚为什么你要返回Task<bool>而不是Task,因为返回值只是永远true,但我认为你可以自己解决这个问题):

public async Task<bool> LoadFoo()
{
    await Foo.ReadAsync("bar");
    await Foo.ReadAsync("baz");
    await Foo.ReadAsync("qux");

    return true;
}

public async Task LoadEverything()
{
    await LoadFoo();
    await OtherLoadMethod();
}
Run Code Online (Sandbox Code Playgroud)