当前位置: 首页 > 知识库问答 >
问题:

Await运算符从不返回使用C#.NET中的Restsharp执行的ExecuteAsync操作的结果

司业
2023-03-14

我创建了一个C#Restsharp客户机,使用同步调用对我的API进行查询。 同步调用正常工作,但异步调用从不返回任何内容。 await运算符应该挂起封闭异步方法的求值,直到其操作数表示的异步操作完成为止。 当异步操作完成时,await运算符返回操作的结果。 然而,在我的情况下,这种情况从来没有发生过。 我现在已经搜索了整个堆栈溢出,但是我不能弄清楚为什么异步调用不会返回任何东西。 有谁能发现是什么原因导致了这些问题?我如何解决这些问题? 这是我的设置:

客户端方法:

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();

返回:System.Collections.Generic.List1[RestSharPapiclient.Model.ObjectWithRelations]

我的异步调用正在执行,但是。。

var obj = _restClient.FetchAllObjects(filter);

从不返回任何内容:

但是,如果在同步调用之前按顺序运行异步调用,则它们都返回正确的结果:

var obj = _restClient.FetchAllObjects(filter);
var objAsync = _restClient.FetchAllObjects(filter).GetAwaiter().GetResult();

返回:

System.Collections.Generic.List1[RestSharPapiclient.Model.ObjectWithRelationsh],System.Collections.Generic.List1[RestSharPapiclient.Model.ObjectWithRelationsh]

这是我的项目文件

TargetFramework=netstandard2.0
<LangVersion>8.0</LangVersion>
"Newtonsoft.Json" Version="12.0.3"
"RestSharp" Version="106.11.4"

如有任何帮助,将不胜感激

共有1个答案

束研
2023-03-14

它尝试执行并退出[原文如此],该行代码为0。

当然,一旦到达一个延续点,程序流就会返回到您的调用函数,其余的代码会做一些事情(在您的情况下,很可能是使用线程池线程来构建响应)。

当您到达main的末尾时会发生什么? 程序将退出。

当然,现在您没有显示如何调用它,但从您显示的代码模式来看,我确信您使用的是同步异步反模式。 不要。 永远不会。 声明您的mainasync和正确的await调用,您将得到您想要的。

 类似资料:
  • 编辑:在测试用例5中,任务似乎处于状态。 我在.NET 4.5中使用System.net.http.HttpClient时遇到了一些奇怪的行为--其中“等待”调用的结果(例如)将永远不会返回。 只有在使用新的Async/Await语言功能和任务API的特定情况下才会出现这种情况--代码似乎总是在只使用延续时工作。

  • 问题内容: 尝试执行以下操作: 我收到此错误: 无法确定条件表达式的类型,因为“ System.DBNull”和“ System.DateTime”之间没有隐式转换 我显然理解该错误,但是考虑到Parameters.Value是object类型,为什么类型甚至很重要?有没有办法完成我想做的事情? 问题答案: 返回值进入的值并没有什么区别,因为 必须首先确定返回值的类型 。 这两个值(投一个,)其他

  • Java1.8正在接收类,它允许我们显式地说明一个方法何时可能返回空值,并在使用它之前“强制”它的使用者验证它是否为空()。 我看到C#有,它执行类似的操作,但使用的是基本类型。它似乎用于DB查询,以区分值是否存在且为0,以及值是否不存在且为NULL。 但似乎C#的对对象不起作用,只对基本类型起作用,而Java的只对对象起作用,对基本类型不起作用。 在C#中是否有一个可为空的/可选的类,迫使我们在

  • 代码1返回1。 代码 2 返回 49。 他们不应该返回相同的结果吗? 请注意,49是1的ASCII码。 编辑:就像@matt在评论里说的那样。使用三元运算符时,“:”的两边被视为同一类型。由于getNumericValue假设它是一个int,两边都是int。条件为真,所以取左边,是chr,但认为是int。

  • 当前的GraphX仅仅支持一组简单的常用结构性操作。下面是基本的结构性操作列表。 class Graph[VD, ED] { def reverse: Graph[VD, ED] def subgraph(epred: EdgeTriplet[VD,ED] => Boolean, vpred: (VertexId, VD) => Boolean): Graph

  • 当我运行这段代码时,我得到以下错误截图 50:7:错误:与“操作员”不匹配

  • 本文向大家介绍Python中的数学运算操作符使用进阶,包括了Python中的数学运算操作符使用进阶的使用技巧和注意事项,需要的朋友参考一下 Python中对象的行为是由它的类型 (Type) 决定的。所谓类型就是支持某些特定的操作。数字对象在任何编程语言中都是基础元素,支持加、减、乘、除等数学操作。 Python的数字对象有整数和浮点数,支持各种数学操作,比如+, -,*, /等。 没有这些操作符

  • 假设我有下表: 我需要一个查询,将插入不存在的标签,并返回所有请求的标签ID。考虑以下事项: 此查询的输出是: 我需要的是在输出中有。