【问题标题】:Xamarin Android correct Asynchronous wayXamarin Android 正确的异步方式
【发布时间】:2017-03-08 09:18:46
【问题描述】:

我是 xamarin android 应用程序的新手。我想构建一个应用程序,我已阅读到与数据库的连接或查询的执行应该与主线程异步发生,否则 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

第二道:

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

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

【问题讨论】:

    标签: android multithreading asynchronous xamarin.android


    【解决方案1】:

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

    1. 从 UI 线程调用 UploadValuesAsync。
    2. UI 线程阻塞,直到方法返回,因为它正在同步运行。
    3. 但是,该方法返回非常快,因为它在内部的另一个线程上异步启动上传过程,并且不等待该过程完成。
    4. 整个上传过程完成后,会调用Client_UploadValuesCompleted

    正如您在 MSDN 上的 WebClient.UploadValuesAsync 页面上看到的那样,它声明:

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

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

    [HostProtection(ExternalThreading=true)]
    

    意思如下:

    暴露外部线程的代码会创建或操作除自己之外的线程,这可能对主机有害。

    总而言之,上传过程在另一个后台线程上处理,否则,您的代码将同步运行。 Xamarin 的示例中存在更多的异步性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2021-07-05
      • 2021-12-02
      • 1970-01-01
      相关资源
      最近更新 更多