发出异步Rest请求

本文关键字:请求 Rest 异步 | 更新日期: 2023-09-27 18:15:01

我正在使用RestSharp在Windows Phone上进行一些Rest请求。

但是我正在努力使用"Aync/await"与我使用的函数:

例如:

   private  void Function() 
        {
            var client = new RestSharp.RestClient("https://exampleapi.com");
            client.Authenticator = [....]
            var request =  new RestSharp.RestRequest("/example.json", Method.GET);
            try
            {
                client.ExecuteAsync(request, reponse =>
                {
                    if (reponse.StatusCode == HttpStatusCode.OK)
                    {

              // Operations with the json...
                    }
                    else
                    {
                        MessageBox.Show("Error");
                    }
                });
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }

我试着像这样添加单词async:

private async void restsharptest() 
            {
                var client = new RestSharp.RestClient("https://exampleapi.com");
                client.Authenticator = [....]
                var request =  new RestSharp.RestRequest("/example.json", Method.GET);
                try
                {
                    client.ExecuteAsync(request, reponse =>
                    {
                        if (reponse.StatusCode == HttpStatusCode.OK)
                        {

  var timeline =  JsonConvert.DeserializeObject<List<dynamic>>(reponse.Content);
                        }
                        else
                        {
                            MessageBox.Show("Error");
                        }
                    });
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
                }
            }

但是当我尝试添加await:

var timeline = await  JsonConvert.DeserializeObject<List<dynamic>>(reponse.Content);

得到以下错误:

无法访问'System.Collections.Generic.List '

和:

Operator 'await'只能在lambda表达式async中使用。马克这个带有lambda表达式修饰符'async'。

我如何使用async/await我的"Function1" ?

编辑:

 client.ExecuteAsync(request, response  =>
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    List_ = new List<Myobject>();
                    List_ = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<List<Myobject>>(response.Content));
                    tcs.SetResult(RefreshList_);
                }
                else
                {
                    MessageBox.Show("Error");
                }
            });

我又出现了这个错误:

Operator 'await'只能在lambda表达式async中使用。马克这个带有lambda表达式修饰符'async'。

如何解决这个问题?

发出异步Rest请求

为了使用async,你应该这样做:

private async void Function() 
{
     var client = new RestSharp.RestClient("https://exampleapi.com");
     client.Authenticator = [....]
     var request =  new RestSharp.RestRequest("/example.json", Method.GET);
     try
     {
         var response = await client.ExecuteTaskAsync(request);
         if (reponse.StatusCode == HttpStatusCode.OK)
         {
             // Operations with the json...
         }
         else
         {
             MessageBox.Show("Error");
         }
     }
     catch (Exception error)
     {
         MessageBox.Show(error.Message);
     }
  }

注意你的ExecuteAsyncExecuteTaskAsync与await before之间的区别

对于返回类型为TaskTask<T>(特殊情况下为void)的标记为async的方法,您只能await(等待)完成。async关键字允许在/lambda方法中使用await关键字。

将lambda标记为async

class.Method(() => { /* Do something sync*/ };
class.Method(async () => { /* Do something async */ };

你可以这样写

{
    ...
    var client = new RestClient(serviceBaseUrl);
    var request = new RestRequest(serviceUrl, Method.GET);
    var content = await client.ExecuteTaskAsync(request);
    var somethingToReturn = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<List<MyClass>>(content));
    ...
}