Await operator never returns 在 C# .NET 中使用 Restsharp 的 ExecuteAsync 操作的结果
Await operator never returns the result of the ExecuteAsync operation using Restsharp in C# .NET
我创建了一个 C# Restsharp 客户端来使用同步调用对我的 API 进行查询。同步调用可以正常工作,但是我的异步调用从来没有 return 任何东西。 await 运算符应暂停对封闭异步方法的评估,直到其操作数表示的异步操作完成。当异步操作完成时,等待运算符 returns 操作的结果。但是,就我而言,这从未发生过。我现在已经搜索了整个堆栈溢出,但我无法弄清楚为什么我的异步调用不会 return 任何东西。谁能发现可能导致问题的原因以及我该如何解决?这是我的设置:
客户端方法:
public class Objects{
private readonly IRestClient _restClient;
public Objects(IRestClient restClient)
{
_restClient = restClient;
}
public async Task< List<ObjectGet> CreateObjects(List<ObjectBase>> objects, Boolean createCdfFile = true)
{
var request = new RestRequest("/objects/", Method.POST) { RequestFormat = DataFormat.Json };
var objectsJson = JsonConvert.SerializeObject(objects, Formatting.Indented);
request.AddParameter("create_cdf_file", createCdfFile, ParameterType.QueryString)
.AddParameter("application/json", objectsJson, ParameterType.RequestBody);
IRestResponse<List<ObjectGet>> response = await _restClient.ExecuteAsync<List<ObjectGet>>(request);
return response.Data;
}
}
我的同步调用有效:
var obj = _restClient.FetchAllObjects(filter).GetAwaiter().GetResult();
returns :
System.Collections.Generic.List1[RestsharpApiClient.model.ObjectWithRelationships]
我的异步调用执行了,但是..
var obj = _restClient.FetchAllObjects(filter);
从来没有return什么:
但是,如果运行异步调用顺序在同步调用之前,它们都return正确的结果:
var obj = _restClient.FetchAllObjects(filter);
var objAsync = _restClient.FetchAllObjects(filter).GetAwaiter().GetResult();
returns:
System.Collections.Generic.List1[RestsharpApiClient.model.ObjectWithRelationships] , System.Collections.Generic.List1[RestsharpApiClient.model.ObjectWithRelationships]
这是我的项目文件
TargetFramework=netstandard2.0
<LangVersion>8.0</LangVersion>
"Newtonsoft.Json" Version="12.0.3"
"RestSharp" Version="106.11.4"
如有任何帮助,我们将不胜感激
It tries to execute and exites [sic] with code 0 at this line.
当然,一旦到达继续点,程序流将返回到您的调用函数,其余代码将执行 某事(在您的情况下,很可能是使用线程池线程构建响应)。
到达 Main
结尾时会发生什么?您的程序退出。
现在你当然没有展示你是如何调用它的,但从你展示的代码模式来看,我肯定你正在使用同步异步反模式。不。曾经。声明您的 Main
async
并正确地 await
您的电话,您会得到想要的。
从评论中我可以推断出,你有这样的东西:
static void Main(string[] args)
{
Program prog = new Program();
prog.OnStart();
}
class Program
{
private async void OnStart()
{
var obj = await _restClient.FetchAllObjects(filter);
Console.Writeline(obj);
}
}
FetchAllObjects
returns Task<List<ObjectWithRelationships>>
,所以通过使用 await
,结果 List<ObjectWithRelationships>
将在 Task
完成时展开,制作 obj
类型 List<ObjectWithRelationships>
.
但是,使用 await
也会导致您的 OnStart
方法 return,安排继续,并且因为它被声明为 void
,所以您的 Main
方法不知道它需要等待,将在 FetchAllObjects
完成之前继续退出。
您需要 return 来自 OnStart
的 Task
:
private async Task OnStart()
现在当 await
被击中时,OnStart
将 return 一个 Task
到 Main
。
您的 Main
方法现在可以等待 Task
完成:
static void Main(string[] args)
{
Program prog = new Program();
prog.OnStart().GetAwaiter().GetResult();
}
如果您使用的是 C#7.1+,则可以使用 async Main
:
static async Task Main(string[] args)
{
Program prog = new Program();
await prog.OnStart();
}
这只是语法糖:
static void Main(string[] args) => MainAsync(args).GetAwaiter.GetResult();
private static async Task MainAsync(string[] args)
{
Program prog = new Program();
await prog.OnStart();
}
我创建了一个 C# Restsharp 客户端来使用同步调用对我的 API 进行查询。同步调用可以正常工作,但是我的异步调用从来没有 return 任何东西。 await 运算符应暂停对封闭异步方法的评估,直到其操作数表示的异步操作完成。当异步操作完成时,等待运算符 returns 操作的结果。但是,就我而言,这从未发生过。我现在已经搜索了整个堆栈溢出,但我无法弄清楚为什么我的异步调用不会 return 任何东西。谁能发现可能导致问题的原因以及我该如何解决?这是我的设置:
客户端方法:
public class Objects{
private readonly IRestClient _restClient;
public Objects(IRestClient restClient)
{
_restClient = restClient;
}
public async Task< List<ObjectGet> CreateObjects(List<ObjectBase>> objects, Boolean createCdfFile = true)
{
var request = new RestRequest("/objects/", Method.POST) { RequestFormat = DataFormat.Json };
var objectsJson = JsonConvert.SerializeObject(objects, Formatting.Indented);
request.AddParameter("create_cdf_file", createCdfFile, ParameterType.QueryString)
.AddParameter("application/json", objectsJson, ParameterType.RequestBody);
IRestResponse<List<ObjectGet>> response = await _restClient.ExecuteAsync<List<ObjectGet>>(request);
return response.Data;
}
}
我的同步调用有效:
var obj = _restClient.FetchAllObjects(filter).GetAwaiter().GetResult();
returns : System.Collections.Generic.List1[RestsharpApiClient.model.ObjectWithRelationships]
我的异步调用执行了,但是..
var obj = _restClient.FetchAllObjects(filter);
从来没有return什么:
但是,如果运行异步调用顺序在同步调用之前,它们都return正确的结果:
var obj = _restClient.FetchAllObjects(filter);
var objAsync = _restClient.FetchAllObjects(filter).GetAwaiter().GetResult();
returns:
System.Collections.Generic.List1[RestsharpApiClient.model.ObjectWithRelationships] , System.Collections.Generic.List1[RestsharpApiClient.model.ObjectWithRelationships]
这是我的项目文件
TargetFramework=netstandard2.0
<LangVersion>8.0</LangVersion>
"Newtonsoft.Json" Version="12.0.3"
"RestSharp" Version="106.11.4"
如有任何帮助,我们将不胜感激
It tries to execute and exites [sic] with code 0 at this line.
当然,一旦到达继续点,程序流将返回到您的调用函数,其余代码将执行 某事(在您的情况下,很可能是使用线程池线程构建响应)。
到达 Main
结尾时会发生什么?您的程序退出。
现在你当然没有展示你是如何调用它的,但从你展示的代码模式来看,我肯定你正在使用同步异步反模式。不。曾经。声明您的 Main
async
并正确地 await
您的电话,您会得到想要的。
从评论中我可以推断出,你有这样的东西:
static void Main(string[] args)
{
Program prog = new Program();
prog.OnStart();
}
class Program
{
private async void OnStart()
{
var obj = await _restClient.FetchAllObjects(filter);
Console.Writeline(obj);
}
}
FetchAllObjects
returns Task<List<ObjectWithRelationships>>
,所以通过使用 await
,结果 List<ObjectWithRelationships>
将在 Task
完成时展开,制作 obj
类型 List<ObjectWithRelationships>
.
但是,使用 await
也会导致您的 OnStart
方法 return,安排继续,并且因为它被声明为 void
,所以您的 Main
方法不知道它需要等待,将在 FetchAllObjects
完成之前继续退出。
您需要 return 来自 OnStart
的 Task
:
private async Task OnStart()
现在当 await
被击中时,OnStart
将 return 一个 Task
到 Main
。
您的 Main
方法现在可以等待 Task
完成:
static void Main(string[] args)
{
Program prog = new Program();
prog.OnStart().GetAwaiter().GetResult();
}
如果您使用的是 C#7.1+,则可以使用 async Main
:
static async Task Main(string[] args)
{
Program prog = new Program();
await prog.OnStart();
}
这只是语法糖:
static void Main(string[] args) => MainAsync(args).GetAwaiter.GetResult();
private static async Task MainAsync(string[] args)
{
Program prog = new Program();
await prog.OnStart();
}