2014-06-08 332 views
0

我有一個要執行的方法列表,其中一些是異步方法,他們需要一段時間才能完成。但是,在程序轉到下一個任務之前,我需要完成這些任務,因爲此時正在執行舊數據。C#等待任務完成

有關如何做到這一點的任何提示?這些是我的任務。我需要前三個任務才能在最後兩次執行前完成處理。

public MainPage() 
{ 
    this.InitializeComponent(); 
    getTemp(); 
    data = new initialData();    

    SetLiveTile(); 
    liveTile();   
} 

PS:這是一個窗口8 metro應用

用於getTemp的代碼()如下。我的問題是,在執行剩餘的方法之前,但在獲取值之前,我需要此方法的值,程序繼續執行SetLiveTile和liveTile方法。

public async void getTemp() 
{ 
    var weatherService = new WeatherService.GlobalWeatherSoapClient(); 
    var result = await weatherService.GetWeatherAsync("", "Malta"); 

    XmlDocument doc = new XmlDocument(); 

    doc.LoadXml(result); 

    int pos = doc.InnerText.IndexOf(" F"); 
    string rem = doc.InnerText.Remove(0, pos + 4); 
    string weather = rem.Substring(0, 2); 

    temp = int.Parse(weather); 
} 

PS:溫度是一個全局變量

+1

所以這些哪一個是awaitable? –

+0

public async void getTemp()和initialData()利用從Facebook獲得的一些數據 –

+0

在主頁面中調用方法:public MainPage() { this.InitializeComponent(); await getTemp(); data = new initialData(); SetLiveTile(); liveTile(); } –

回答

1

我不知道自己的哪些任務被在不同的線程運行,但在理論上,當你有一個線程,並且要AFTER做點什麼它完成了它的任務,你使用thread.join()方法(很像Java)。

+0

沒錯。幾乎所有的異步代碼都需要_some_同步活動。 –

+0

如何在這種情況下使用thread.join? –

+0

在這個例子中,你將不得不使用await,並將方法的返回類型從'void'更改爲'Task' – MrCakePie

0

我真的不知道Windows應用商店中的事件,但在Windows窗體中,您可以在加載時添加異步事件處理程序,例如 - 說我們有3種方法需要一些時間才能完成:

private Task DoWork() { 
    return Task.Delay(3000); 
} 

private Task DoSomeMoreWork() { 
    return Task.Delay(5000); 
} 

private Task DoEvenMoreWork() { 
    return Task.Delay(7000); 
} 

private async void MyForm_Load(object sender, EventArgs e) { 
    // this will take 7 seconds it will execute all the methods at the same time and will resume when all are completed 
    await Task.WhenAll(DoWork(), DoSomeMoreWork(), DoEvenMoreWork()); 

    // will be here when all the methods are done executing 
} 

我希望這至少給你一個想法。

+0

基本上我需要這個,因爲我需要顯示一個溫度值,並且需要很長時間才能獲得它並且在任務完成之前顯示默認值。我會試試看看會發生什麼。 –

+0

我在問題中添加了方法 - 我沒有設法在任務完成之前完成任務 –