2013-03-11 88 views
0

如何在不使用下面代碼中的函數service_GetItemInfoCompleted()的情況下調用webservice? 它可以得到沒有函數service_GetItemInfoCompleted()的結果。在windows phone上調用webservice

有什麼想法?

private void btnFind_Click(object sender, RoutedEventArgs e) 
{ 
     Service1Client service = new Service1Client(); 
     service.GetItemInfoAsync(txt1.Text); 
     service.GetItemInfoCompleted += new EventHandler<GetItemInfoCompletedEventArgs>(service_GetItemInfoCompleted);  
} 

void service_GetItemInfoCompleted(object sender, GetItemInfoCompletedEventArgs e) 
{ 
     txb1.Text = e.Result; 
} 

實施例2

回答

0

上述方法是正確的做法:將請求發送給所述服務,當它返回,在文本框顯示返回的數據。

如果你在一個阻塞調用,進行同樣的操作...

private void btnFind_Click(object sender, RoutedEventArgs e) 
{ 
    Service1Client service = new Service1Client(); 
    txtb1.Text = service.GetItemInfoAsync(txt1.Text); 
} 

...那麼你的主UI線程會被阻塞,直到數據從服務返回。如果服務需要幾秒鐘才能返回,那麼您應用的用戶界面會間歇性地「掛起」幾秒鐘,給用戶帶來非常差的體驗。這是一個不好的要做的事情和不惜一切代價避免!

所以我們想異步地調用你的服務並等待它返回而不阻塞線程。但是,而不是手工編寫異步代碼,我們可以使用C#5.0中的新async & await關鍵字來實現與上述相同的目標,但用更少的代碼&複雜:

private async void btnFind_Click(object sender, RoutedEventArgs e) 
{ 
    Service1Client service = new Service1Client(); 
    string result = await service.GetItemInfoAsync(txt1.Text); 
    txtb1.Text = result; 
} 

注意使用asyncawait在上面的代碼中。 async關鍵字告訴編譯器你想讓它建立一個由等待狀態驅動的狀態機。每個await關鍵字都會告訴編譯器爲狀態機添加一個新狀態。當執行代碼時,當等待執行的任務(在這種情況下爲service.GetItemInfoAsync())完成時,等待代碼將設置狀態機在下一個操作中啓動。

HTH。

+0

Thx @Richard Turner。我可以問,如果沒有txt1.Text,等待仍然可以運行? – likewer 2013-03-11 06:57:56

+0

我可以在代碼的下面添加另一個不同類型的示例。 – likewer 2013-03-11 08:46:19

相關問題