如何在Task.WhenAll中分配变量

时间:2018-07-23 09:55:42

标签: c# asynchronous xamarin task

所以我在xamarin Android应用程序中有一些异步方法,这些方法将返回Task

我正在尝试使用Task.WhenAll调用多个异步方法。 我正在使用task.WhenAll,以便它将并行执行方法。 另外,我从onCreate调用该方法,所以我试图通过使用Task.WhenAll()。ContinueWith();

所以在我的活动中,我有

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.content);

        LoadAsyncData();
    }

    private void LoadAsyncData()
    {
        Task.WhenAll(
        AsyncDataBase.SelectClass1(),
        AsyncDataBase.SelectClass2().ContinueWith(t =>{}));
    }

我想实现的是

    private void LoadAsyncData()
    {
        Class1 c1 = new Class1() 
        Class2 c2= new Class2() 

        Task.WhenAll(
        c1 = AsyncDataBase.SelectClass1(),
        c2 = AsyncDataBase.SelectClass2().ContinueWith(t =>{}));
    }

但是它抱怨我无法将系统线程任务转换为MyClass, 请注意,我想使该方法保持同步,因为我想从OnCreate调用它。

1 个答案:

答案 0 :(得分:2)

我可能只会写:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    SetContentView(Resource.Layout.content);

    LoadAsyncData();
}

private async Task LoadAsyncData()
{
    var tc1 = AsyncDataBase.SelectClass1();
    var tc2 = AsyncDataBase.SelectClass2();
    var c1 = await tc1;
    var c2 - await tc2;
    //Whatever was going in `ContinueWith`
}

现在LoadAsyncData将同步运行,直到遇到不完整的可观察对象的第一点为止。这可能是我们await tc1的时候。如果您非常(不幸),那么两个异步调用实际上将在我们到达各自的await之前完成,因此整个代码将同步运行。但是,如果要完成的额外工作也比CPU相关的I / O还要多,并且还可以从异步中受益,那么通常这是更可取的。

只有在受CPU限制且不应阻止OnCreate完成的情况下,才考虑在此时使用Task.Run()启动新任务。

这确实给您带来了TaskOnCreate未被观察的问题。如果您只关心其余代码中可能引发的任何异常,即使基于ContinueWith表单,则都需要安装Zeppelin Tutorial事件无论如何< / em>,所以这应该不会改变太多。