1

我在 xaml 页面上有一个活动指示器。最初,它的 IsVisible 属性为假。我在页面上有一个按钮。当用户单击按钮时,它会调用 Web 服务来获取数据。在调用服务之前,我将 IsVisible 属性的值更改为 true,以便活动指示器开始显示在页面上,在成功调用服务后,我再次将其值更改为 false,以便它不再在页面上显示。

但它不起作用。我知道实际的问题。当我们调用 Web 服务时,UI 线程被阻塞并且它不显示活动指示器。如何在调用 Web 服务时启用 UI 线程,以便活动指示器可以显示在页面上,直到我们获取数据?

4

2 回答 2

2

尝试将您的网络服务调用变成一个asyncawait它。

根据您构建事物的方式,您可能必须使用 a TaskCompletionSource,如下例所示。

在此示例中,当单击按钮时,按钮变为不可见,并ActivityIndicator设置IsRunning=True显示它。

然后它ExecuteSomeLongTask使用TaskCompletionSource.

原因是在我们的按钮点击代码中,我们有最后几行:-

              objActivityIndicator1.IsRunning = false;
              objButton1.IsVisible = true;

停止ActivityIndicator运行和显示,并将按钮设置可见状态。

如果我们不使用 aTaskCompletionSource这些行将在调用后立即执行ExecuteSomeLongTask如果它是一个正常的异步方法/函数,并会导致ActivityIndicator 运行并且按钮仍然可见。

例子:-

        Grid objGrid = new Grid()
        {
        };

        ActivityIndicator objActivityIndicator1 = new ActivityIndicator();
        objGrid.Children.Add(objActivityIndicator1);

        Button objButton1 = new Button();
        objButton1.Text = "Execute webservice call.";
        objButton1.Clicked += (async (o2, e2) =>
          {
              objButton1.IsVisible = false;
              objActivityIndicator1.IsRunning = true;
              //
              bool blnResult = await ExecuteSomeLongTask();
              //
              objActivityIndicator1.IsRunning = false;
              objButton1.IsVisible = true;
          });
        objGrid.Children.Add(objButton1);

        return objGrid;

支持功能:-

    private Task<bool> ExecuteSomeLongTask()
    {
        TaskCompletionSource<bool> objTaskCompletionSource1 = new TaskCompletionSource<bool>();
        //
        Xamarin.Forms.Device.StartTimer(new TimeSpan(0, 0, 5), new Func<bool>(() =>
        {
            objTaskCompletionSource1.SetResult(true);
            //
            return false;
        }));
        //
       return objTaskCompletionSource1.Task;
    }
于 2016-02-15T08:10:09.390 回答
0

您需要以异步方式完成工作。或者换句话说:Asnyc & Await用于确保您的 UI 在通话期间运行良好。

您可以在Xamarin Docs中找到更多信息。

async 和 await 是新的 C# 语言功能,它们与任务并行库结合使用,可以轻松编写线程代码来执行长时间运行的任务,而不会阻塞应用程序的主线程。

如果您需要进一步的帮助,请更新您的问题并发布您的代码或您迄今为止尝试过的内容。

于 2016-02-15T07:55:36.033 回答