C# 活动指示器未正确加载

C# 活动指示器未正确加载,c#,azure,asynchronous,xamarin,xamarin.forms,C#,Azure,Asynchronous,Xamarin,Xamarin.forms,当代码消失并调用azure时,我使用活动指示器向用户显示。 调用本身工作正常,一切正常,但活动指示器加载一段设定的时间,然后在加载下一个屏幕后,我试图阻止用户的相同延迟仍然发生。 我可能应该澄清一下,我对Xamarin比较陌生,很多异步/等待的东西都暗指我。 我将API调用放在一个任务中,并将一个名为sleep的等待方法放在其中,该方法运行约4秒。这是我让它运行活动指示器的唯一方法。但看起来这也是造成问题的原因,所以总结一下,我被卡住了。 我希望对Azure的调用在活动指示器运行时进行,然后在返

当代码消失并调用azure时,我使用活动指示器向用户显示。 调用本身工作正常,一切正常,但活动指示器加载一段设定的时间,然后在加载下一个屏幕后,我试图阻止用户的相同延迟仍然发生。 我可能应该澄清一下,我对Xamarin比较陌生,很多异步/等待的东西都暗指我。 我将API调用放在一个任务中,并将一个名为sleep的等待方法放在其中,该方法运行约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();

}
这是调用API的登录方法:

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一点也不熟悉,这对我没有帮助。 一个想法

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

等待睡眠;在HandleSubmitCommand下,不需要使用该命令方法。此时,您的登录操作将在4s后执行。基于你的 登录方法,则通过httpClient.PostAsyncURI、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;
}
public interface IWebService
{
   Task<bool> Login(string ID, string IDPayload, string TenantID);
}
public interface IWebService
{
   Task<bool> Login(string ID, string IDPayload, string TenantID);
}