2014-12-06 40 views
0

我具有使用正確的代碼運行該方法LoadSystemData我卻用它的任務一些麻煩似乎之前實際上已經完成了它的任務,或因此在我看來,要設置IsLoaded真。關鍵字等待關鍵字是可能不是,因爲這個代碼在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

你想做什麼?這個靜態方法應該是一個asyncTask嗎? – Mike 2014-12-06 15:13:06

+1

小心解釋爲什麼* await關鍵字可能不是一個好主意,因爲此代碼在OnCreate活動*中運行?如果我沒有錯,你發佈的代碼將會陷入僵局。順便說一句你的問題是什麼? *我有一些麻煩* - 他們是什麼? – 2014-12-06 15:14:44

+0

我雖然認爲OnCreate是第一個必須運行的活動生命週期方法,但它異步運行會產生問題,請注意,我對異步編程的瞭解非常有限。從代碼示例的測試運行中,看起來好像任務在任何Profile.Load()等完成之前完成。 – Guano 2014-12-06 16:21:05

回答

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(),它會調用該方法,這又會調用asyncProfileLoad()方法。此時,LoadSystemData()將返回而未完成,並且OnCreate()將返回而未完成。 (注意:在現實中,異步操作總是有可能同步完成,但爲了這個例子,我假設不會發生,因爲這不是有趣的場景)。

然後OnCreate()方法的調用者將繼續執行,而您的LoadSystemData()方法將繼續異步工作。最終,它將完成,框架將在LoadSystemData()號召後立即恢復執行OnCreate()方法,從而完成其餘的工作。即執行「一些其他的東西」代碼。

如果要求OnCreate()方法在返回之前完成其所有初始化,那麼理想情況會更差。在這種情況下,LoadSystemData()是異步的這一事實並不有用,但您至少仍然可以通過同步等待代碼來使代碼正常工作。例如:

override void OnCreate() 
{ 
    // some stuff 

    if (!ClientObjects.IsLoaded) 
    { 
     LoadSystemData().Wait(); 
    } 

    // some other stuff 
} 

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