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 来自 OnStartTask:

private async Task OnStart()

现在当 await 被击中时,OnStart 将 return 一个 TaskMain

您的 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();
}