我在使用正确的代码运行此方法LoadSystemData时遇到了一些麻烦,但我使用的任务似乎在实际完成任务之前将IsLoaded设置为true,或者在我看来。关键字await关键字可能不是一个好主意,因为此代码在OnCreate活动中运行
if (!ClientObjects.IsLoaded)
{
t = Task.Factory.StartNew (() => LoadSystemData ());
t.Wait ();
}
public static async Task LoadSystemData()
{
await Profile.Load();
await GroceriesHistory.Load();
clientGroups = await Group.LoadAll();
clientShoppingLists = await ShoppingList.LoadAll();
IsLoaded = true;
}
答案 0 :(得分:1)
LoadSystemData()
方法将在第一个await
语句处返回。这就是async
方法的工作原理。然后将调用包装在Task
中的方法中,并等待Task
完成。但请注意,您正在等待外部Task
完成,而不是LoadSystemData()
Task
。
我不知道Android OnCreate()
方法的规则。但理想情况下,允许它在完成所有初始化之前返回,这可以允许异步完成。在这种情况下,你想要的更像是这样:
// Guessing at method signature here...the key is to add `async`
override async void OnCreate()
{
// some stuff
if (!ClientObjects.IsLoaded)
{
await LoadSystemData();
}
// some other stuff
}
调用OnCreate()
方法时,它会执行所有“某些东西”代码,如果需要调用LoadSystemData()
,它会调用该方法,然后调用{ {1}} async
方法。此时,ProfileLoad()
将在未完成的情况下返回,LoadSystemData()
将在未完成的情况下返回。
(注意:实际上异步操作总是有可能同步完成。但是为了这个例子,我假设没有发生,因为那不是有趣的场景)。
您的OnCreate()
方法的调用者将继续执行,而您的OnCreate()
方法将继续异步工作。最终,它将完成,框架将在调用LoadSystemData()
后立即恢复OnCreate()
方法的执行,从而允许它完成其余的工作。即执行“其他一些东西”代码。
如果在返回之前需要LoadSystemData()
方法来完成所有初始化,那么情况就不那么理想了。在这种情况下,OnCreate()
是异步的这一事实没有用,但你仍然可以通过同步等待它来使代码工作。例如:
LoadSystemData()
希望您可以使用第一个示例,而不是第二个示例。