내 Xamarin Android 앱이 느리게 실행되는 것을 발견 했으므로 성능을 향상시키기 위해 일부 비동기/대기 코드를 추가했습니다. UI 스레드에서 내 API 호출을 제외하고 싶었습니다. 나는 이것이 async/await를 사용할 수있는 완벽한 기회라고 생각했다. 그래서, 함수의 서명에 async를 추가하고 반환 값 유형에 대해 Task를 래핑했습니다. 그런 다음 RestSharp GET 호출을 "await client.ExecuteTaskAsync"로 업데이트했습니다. 일단이 작업을 수행하면 GetCustInfo 함수에 대한 호출을 업데이트해야한다는 것을 알았습니다. 나는 호출의 마지막에 .Result를 추가하기 만하면 오류가 표시되지 않았다. 문제는 GetCustInfo 호출에 응답하지 않고 작동하지 않는다는 것입니다.Xamarin Android 앱 - 성능 향상을 위해 async/API 호출을 기다리는 중 문제가 발생했습니다.
내가 뭘 잘못하고 있니? 나는에서 비동기/await를 함수를 호출 할 때
public async Task<List<CustInfo>> GetCustInfo(string strBranchNumber, string dblCurrentXCoordinate, string dblCurrentYCoordinate)
{
if (this.strBearerToken == string.Empty)
{
throw new ArgumentException("No Bearer Token Found");
}
try
{
var restUrl = this.strCustomerInfoAPIURL;
var uri = new Uri(string.Format(restUrl, string.Empty));
var client = new RestClient(uri);
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "bearer " + this.strBearerToken);
request.AddParameter("intBranchNumber", strBranchNumber);
request.AddParameter("intZipCode", this.strZipCode);
request.AddParameter("intCustomerType", this.strCustomerType);
request.AddParameter("intMinTotalAmount", this.strMinRevenue);
request.AddParameter("dblCurrentXCoordinate", dblCurrentXCoordinate);
request.AddParameter("dblCurrentYCoordinate", dblCurrentYCoordinate);
request.AddParameter("bolGetLocation", true);
var response = await client.ExecuteTaskAsync(request);
return JsonConvert.DeserializeObject<List<CustInfo>>(response.Content).OrderBy(x => x.ApproxDistance).ToList();
}
catch (Exception ex)
{
return null;
}
}
그래서 무슨 일이 일어나고 것은 내에서 OnCreate 내가 customer.GetCustomerInfo를 호출 할 때 그냥 중지().
protected override void OnCreate(Bundle bundle)
{
....
this.tableItems = customer.GetCustInfo(
"xxxxxxx",
this.currentLocation.Latitude.ToString(),
this.currentLocation.Longitude.ToString()).Result;
this.listView.Adapter = new ListOfLocationAdapter(this, this.tableItems);
}
OnCreate 자체는 입력하는 동작의 UI 스레드이며 비동기가 아니며 GetCustInfo 호출을 기다리고 있지 않습니다. 그래서 그것은 블로킹 콜처럼 행동합니다. UI 라이프 사이클에서 다른 이벤트를 사용하여 트리거하고 'await' 구문을 사용하여 호출하십시오. – dlatikay
무슨 뜻인지 예를 들려 줄 수 있습니까? UI주기의 모든 이벤트가 UI 스레드의 일부가 아니겠습니까? –
나는 약간의 조사를했고 수명주기 내에있는 OnStart 호출에서 custinfo에 대한 호출을 추가해야한다는 것을 알았습니다. 그것은 효과가있다. 팁 고마워! –