所以我在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调用它。
答案 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()
启动新任务。
这确实给您带来了Task
中OnCreate
未被观察的问题。如果您只关心其余代码中可能引发的任何异常,即使基于ContinueWith
表单,则都需要安装Zeppelin Tutorial事件无论如何< / em>,所以这应该不会改变太多。