2012-11-03 66 views
2

視覺工作室給我關於不等待我的MessageDialog.ShowAsync()Launcher.LaunchUriAsync()方法的各種警告。我應該等待像MessageDialog和Launcher方法的異步調用嗎?

它說:

「考慮應用的await關鍵字」

很顯然,我並不需要等待他們,但就是這將是有益的?

等待調用顯然會阻塞UI線程,這很糟糕 - 那麼爲什麼Visual Studio會拋出如此多的警告?

+0

是否http://msdn.microsoft。 com/en-us/library/hh965065.aspx有幫助嗎? –

回答

4

等待顯然是調用阻塞UI線程這是壞

await實際上並沒有阻止用戶界面。 await暫停執行該方法,直到等待完成的任務完成,然後繼續該方法的其餘部分。閱讀更多關於await (C# Reference)

很明顯,我不需要等待他們,但它會是有益的嗎?

如果你不使用await,然後完成MessageDialog.ShowAsync()之前可以完成呼叫MessageDialog.ShowAsync()的方法。你不需要,但這是個好習慣。

例如,假設您想要下載一個字符串,並使用它,沒有的await:

async void MyAsyncMethod() 
{ 
    var client = new HttpClient(); 
    var task = client.GetStringAsync("http://someurl.com/someAction"); 

    // Here, GetStringAsync() may not be finished when getting the result 
    // and it will block the UI thread until GetStringAsync() is completed. 
    string result = task.Result; 
    textBox1.Text = result; 
} 

但是如果我們用await

async void MyAsyncMethod() 
{ 
    var client = new HttpClient(); 
    string result = await client.GetStringAsync("http://someurl.com/someAction"); 

    // This method will be suspended at the await operator, 
    // awaiting GetStringAsync() to be completed, 
    // without freezing the UI, and then continues this method. 

    textBox1.Text = result; 
} 
+1

該方法的第一個版本阻止調用/ UI線程,直到您訪問Result屬性時任務完成。 –

+0

@JamesManning你是對的,我在想什麼。我更新了評論。下次我會做一個更好的例子=)感謝您指出。 –