여기에 내 코드가 있지만 일단 비동기 함수를 호출하기 시작한 후 다른 것들을 할 수없는 것처럼 보입니다. 그런 다음 앱이 응답하지 않습니다. 나는 그것을 배경으로 돌리고 싶다.
나는 검색을하고 있고 매 3 글자마다 일치하는 것이 있으면 데이터를 얻기 위해 API를 호출 할 것이다. 3 글자를 입력하면 API를 호출하고 앱이 응답하지 않아 편지를 더 입력 할 수 없습니다.
비동기 함수를 호출하는 방법 및 백그라운드에서 실행되므로 검색 할 수 있습니다.
void Entry_TextChanged(object sender, TextChangedEventArgs e)
{
var newText = e.NewTextValue;
//once 3 keystroke is visible by 3
if (newText.Length % 3 == 0)
{
//Call the web services
var result = GettingModel(newText);
if (result != null || result != string.Empty)
{
ModelVIN.Text = result;
}
}
}
private string GettingModel(string vinText)
{
var task = getModelForVIN(vinText);
var result = task.Result;
return result.Model;
}
private async Task<VINLookUp> getModelForVIN(string vinText)
{
var deviceId = CrossDeviceInfo.Current.Model;
deviceId = deviceId.Replace(" ", "");
var requestMgr = new RequestManager(deviceId);
var VinData = new VINLookUp();
VinData = await requestMgr.getModelForVIN(vinText);
return VinData;
}
도움에 미리 감사드립니다.
너는 필요 없어.GettingModel(string vinText)
방법.
전화Task.Result
주 스레드를 차단하고 있습니다.
부름.Result
UI 스레드에서 발생할 가능성이있는 모든 것을 교착 상태로 만들 수 있습니다. 용도ContinueWith
또는async void
와await
.
당신은Entry_TextChanged
비동기 및await
웹 요청은 UI를 차단하지 않도록합니다.
별도의 스레드에서 실행하여 사용할 수도 있습니다.ContinueWith()
사용자가 조작이 완료되기를 기다릴 필요가없는 경우. 당신이 그 길을가는 경우에 당신이 사용하는지 확인하십시오.Device.BeginInvookeOnMainThread()
UI 스레드에서 실행해야하는 코드를 실행합니다.
더 나은 코드는 다음과 같습니다.
private async void Entry_TextChanged(object sender, TextChangedEventArgs e)
{
var newText = e.NewTextValue;
//once 3 keystroke is visible by 3
if (newText.Length % 3 == 0)
{
//Call the web services
var result = await GetModelStringForVIN(newText);
if (string.IsNullOrEmpty(result) == false)
{
ModelVIN.Text = result;
}
}
}
private async Task<string> GetModelStringForVIN(string vinText)
{
var deviceId = CrossDeviceInfo.Current.Model;
deviceId = deviceId.Replace(" ", string.Empty);
var requestMgr = new RequestManager(deviceId);
var VinData = await requestMgr.getModelForVIN(vinText);
return VinData?.Model;
}
다음 링크는 개념을 더 잘 이해하는 데 도움이됩니다.
String.IsNullOrEmpty
. 한편,ModelVIN.Text
초기화되어 있지 않은 경우는 null가됩니다. 왜 쓰지 않는가?ModelVIN.Text = result
그때? - Panagiotis KanavosModelVIN
전역 변수가 아니라 로컬 변수가 아닌 경우 함수의 실행 전에 값을 가질 수도 있습니다. 운영자는 조건을 충족시키지 못하면 이전 값을 유지하려고 할 수 있습니다. - Rohit Vipin MathewsContinueWith
:stackoverflow.com/questions/18965200/… - Krumelur