2017-03-08 75 views
0

我是新的xamarin安卓應用程序。我想要建立一個應用程序,我已經讀取與數據庫的連接或查詢的執行應該從主線程異步發生,否則UIthread可能會崩潰。發現2種方式來做到這一點:Xamarin Android正確的異步方式

第一種方式:

WebClient client = new WebClient(); 
Uri uri = new Uri("http://192.168.2.8/CreateUsername.php"); 
NameValueCollection parameters = new NameValueCollection(); 
parameters.Add("Name", txtname.text); 
client.UploadValuesCompleted += Client_UploadValuesCompleted; 
client.UploadValuesAsync(uri,parameters); ---> is this gonna create a new thread and run asynchronously??? 

(在這裏我找到了第一種方式:https://www.youtube.com/watch?v=jF3D__ibrx8

SecondWay:

https://developer.xamarin.com/recipes/android/web_services/consuming_services/call_a_rest_web_service/

兩種方式都是正確的?兩種方式都會創建一個新的線程並異步運行?謝謝!

回答

0

這兩個例子都可以,但我通常會首先相信Xamarin的官方文檔。調用UploadValuesAsync方法時,可能會使第一個示例混淆的是缺少await關鍵字。以下是實際發生的事情:

  1. 調用UploadValuesAsync是從UI線程進行的。
  2. UI線程阻塞,直到方法返回,因爲它同步運行。
  3. 但是,該方法返回非常快,因爲它在內部在另一個線程上異步啓動上載進程,並且不會等待進程完成。
  4. 當整個上傳過程完成時,Client_UploadValuesCompleted將被調用。

正如你可以在MSDN上WebClient.UploadValuesAsync頁面上看到的,它指出:

這些方法不會阻止調用線程。

此外,望着source code for UploadValuesAsync時,你會發現在上面定義以下屬性:

[HostProtection(ExternalThreading=true)] 

這意味着:暴露外螺紋創建或

代碼操縱非自己的線程,這可能對主機有害。

總結起來,上傳過程是在另一個後臺線程上處理的,否則你的代碼將同步運行。 Xamarin示例中出現了更多不同步現象。