从非异步方法调用异步方法

时间:2016-08-10 05:57:49

标签: c# asynchronous xamarin async-await xamarin.forms

以下是我这样做的代码,但是一旦它开始调用异步函数然后应用程序就不会响应,我似乎无法做其他事情。我想把它运行到后台。

我正在进行搜索,在每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;
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您不需要GettingModel(string vinText)方法。 通过调用Task.Result,您将阻止主线程。

在UI线程中调用.Result可能会使您遇到的所有事情陷入僵局。将ContinueWithasync voidawait一起使用。

您可以设置Entry_TextChanged异步和await网络请求,以便它不会阻止用户界面。

如果您不需要让make用户等待操作完成,您甚至可以在单独的线程上运行它并使用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 Async Support Overview
  2. Asynchronous Operations with Xamarin