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