活动指示器未正确加载

时间:2017-11-23 17:16:06

标签: c# azure asynchronous xamarin xamarin.forms

我正在使用活动指示器在代码消失时向用户显示并调用azure。 呼叫本身工作正常,一切运行良好,但活动指示器加载一段时间,然后我试图阻止用户的相同延迟仍然发生,然后下一个屏幕加载。 我应该澄清一下,我对Xamarin来说相对较新,而且很多这种async / await东西都暗示着我。 我已将API调用放在一个Task中,并在其中放置一个名为sleep的await方法,该方法运行大约4秒钟。这是我能够运行活动指标的唯一方法。但看起来这也导致了这个问题,所以总结一下我被困了。 我希望在活动指示器运行时调用Azure,然后返回打开下一页,以防止页面滞后和冻结。它看起来不太好。 所以,这是调用API的方法:

private async Task HandleSubmitCommand()
{
        //if (IsLoading) return;
        IsLoading = true;

        await Sleep();

            if (!string.IsNullOrEmpty(IdentityDriver))
            {

                _entryFieldType = "oid";
                _statusResponse = DependencyService.Get<IWebService>().Login(_entryFieldType, IdentityDriver, App.TenantId.Value.ToString());
                IsLoading = false;
            }
            else
            {
                _entryFieldType = "rid";
                _statusResponse = DependencyService.Get<IWebService>().Login(_entryFieldType, IdentityRoute, App.TenantId.Value.ToString());
            }


        if (_statusResponse == "True")
        {
            Application.Current.MainPage = new DriverDashboardView();

        }
        else
            Application.Current.MainPage = new NotFoundView();

}

这是睡眠方法:

    private Task Sleep()
    {
        return Task.Delay(4000);
    }

这是调用API的Login方法:

public string Login(string ID, string IDPayload, string TenantID)
    {
        //await Sleep();
        var BaseURL = App.ConFigURL;
        var URI = string.Format(BaseURL, TenantID);

        using (var httpClient = new HttpClient(new HttpClientHandler()))
        {
            httpClient.BaseAddress = new Uri(URI);

            var Telemetry = new { typeid = ID , id = IDPayload};
            var Payload = JsonConvert.SerializeObject(Telemetry);
            var SAS = DependencyService.Get<ISasToken>().CreateToken(URI, "RootManageSharedAccessKey", "#####################################");

            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", SAS);
            var Content = new StringContent(Payload, Encoding.UTF8, "application/json");


            var Response = httpClient.PostAsync(URI,Content).Result;

            return Response.IsSuccessStatusCode.ToString();

        }
    }

正如我所说,对Azure的调用很好,但它似乎并没有异步运行。我对async / await一点都不熟悉并没有帮助。 一个想法?

1 个答案:

答案 0 :(得分:1)

  

我希望在活动指示器运行时调用Azure,然后返回打开下一页,以防止页面滞后和冻结。

您的await Sleep();方法下的HandleSubmitCommand是不必要的。此时,您的登录操作将在4秒后执行。基于你的 Login方法,您通过httpClient.PostAsync(URI,Content).Result同步执行登录操作。您可以按如下方式修改方法:

public async Task<bool> Login(string ID, string IDPayload, string TenantID)
{
   .
   .
   var Response = await httpClient.PostAsync(URI,Content);
   return Response.IsSuccessStatusCode;
}

private async Task HandleSubmitCommand()
{
   IsBusy = true;
   //call the login operation asynchronously
   _statusResponse = await DependencyService.Get<IWebService>().Login(_entryFieldType, IdentityDriver, App.TenantId.Value.ToString());
   IsBusy = false;
}

注意:您需要更改IWebService界面的定义,如下所示:

public interface IWebService
{
   Task<bool> Login(string ID, string IDPayload, string TenantID);
}