任务和线程问题

时间:2014-12-06 15:05:09

标签: c# android android-asynctask

我在使用正确的代码运行此方法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;
    }

1 个答案:

答案 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()

希望您可以使用第一个示例,而不是第二个示例。