1

여기에 내 코드가 있지만 일단 비동기 함수를 호출하기 시작한 후 다른 것들을 할 수없는 것처럼 보입니다. 그런 다음 앱이 응답하지 않습니다. 나는 그것을 배경으로 돌리고 싶다.

나는 검색을하고 있고 매 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;
}

도움에 미리 감사드립니다.


  • 이벤트 처리기를 asyncouse 이벤트 핸들러로 변경하십시오. 즉, 'async void Entry_TextChanged () {...; var result = await getModelForVIN () ...;} # - Panagiotis Kanavos

1 답변


3

너는 필요 없어.GettingModel(string vinText)방법. 전화Task.Result주 스레드를 차단하고 있습니다.

부름.ResultUI 스레드에서 발생할 가능성이있는 모든 것을 교착 상태로 만들 수 있습니다. 용도ContinueWith또는async voidawait.

당신은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;
 }

다음 링크는 개념을 더 잘 이해하는 데 도움이됩니다.

  1. Xamarin 비동기 지원 개요
  2. Xamarin을 사용한 비동기 작업


  • null 체크는 다음과 같이 대체 될 수도 있습니다.String.IsNullOrEmpty. 한편,ModelVIN.Text초기화되어 있지 않은 경우는 null가됩니다. 왜 쓰지 않는가?ModelVIN.Text = result그때? - Panagiotis Kanavos
  • @PanagiotisKanavos - 잡아 주셔서 감사합니다, 코드를 업데이 트되었습니다. - Rohit Vipin Mathews
  • @PanagiotisKanavos -ModelVIN전역 변수가 아니라 로컬 변수가 아닌 경우 함수의 실행 전에 값을 가질 수도 있습니다. 운영자는 조건을 충족시키지 못하면 이전 값을 유지하려고 할 수 있습니다. - Rohit Vipin Mathews
  • 사용시주의ContinueWith:stackoverflow.com/questions/18965200/… - Krumelur

연결된 질문


관련된 질문

최근 질문