Xamarin Android正确的异步方式

时间:2017-03-08 09:18:46

标签: android multithreading asynchronous xamarin.android

我是xamarin android app的新手。我想构建一个应用程序,我已经读过与数据库的连接或查询的执行应该从主线程异步发生,否则UIthread可能会崩溃。我找到了两种方法那样做:

第一种方式:

    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/

两种方式都是正确的?两种方式都会创建一个新的线程并异步运行?谢谢!!!!

1 个答案:

答案 0 :(得分:0)

两个例子都没问题,但我通常首先相信Xamarin的官方文档。您可能会对第一个示例感到困惑的是,在调用UploadValuesAsync方法时缺少await关键字。这是实际发生的事情:

  1. 从UI线程调用UploadValuesAsync。
  2. UI线程阻塞,直到该方法返回,因为它正在同步运行。
  3. 但是,该方法返回非常快,因为它在内部的另一个线程上异步启动上载进程,而不是等待进程完成。
  4. 整个上传过程完成后,系统会调用Client_UploadValuesCompleted
  5. 正如您在MSDN上的WebClient.UploadValuesAsync页面上看到的那样,它指出:

      

    这些方法不会阻止调用线程。

    另外,在查看source code for UploadValuesAsync时,您会注意到顶部定义了以下属性:

    [HostProtection(ExternalThreading=true)]
    

    表示以下内容:

      

    公开外部线程的代码会创建或操纵自己以外的线程,这可能对主机有害。

    总而言之,上传过程是在另一个后台线程上处理的,否则,您的代码将同步运行。 Xamarin的样本中出现了一些异步性。