我正在使用活动指示器在代码消失时向用户显示并调用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一点都不熟悉并没有帮助。 一个想法?
答案 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);
}