c# – 尽管任务已完成,但Task.Wait始终返回false
发布时间:2020-12-15 04:33:52 所属栏目:百科 来源:网络整理
导读:我正在使用HttpClient尝试在Web API控制器中执行POST方法.控制器方法是同步的.我是这样做的: var response = owin.HttpClient.PostAsJsonAsync(uri,body); 在那之后我打电话给Wait: var result = response.Wait(15000); 运行此代码时,我看到http结束执行,
我正在使用HttpClient尝试在Web API控制器中执行POST方法.控制器方法是同步的.我是这样做的:
var response = owin.HttpClient.PostAsJsonAsync(uri,body); 在那之后我打电话给Wait: var result = response.Wait(15000); 运行此代码时,我看到http结束执行,但结果值始终为false.我能错过什么? 编辑: public IHttpActionResult Add(Item item) { var result = _db.AddItem(item); return Ok(result); } 测试项目: TestServer _owinTestServer; public async Task<HttpResponse message> Method1(string url,object body) { return await _owinTestServer.HttpClient.PostAsJsonAsync(url,body); } public async Task<ItemPreview> Method2(object body); { return await Method1("..",body ).Result.Content.ReadAsAsync<ItemPreview>(); } [TestMethod] public void test1() { Item item = new(...); Method2(item).Continue with(task => {// Never reach here } } 我究竟做错了什么? 解决方法
您正在混合异步和阻塞调用(即.Result,.Wait()),这会导致死锁.
这看起来更像是测试客户端的阻塞问题. 如果要等待服务器的结果,则需要在此情况下始终使测试异步. 将测试方法转换为异步 [TestMethod] public async Task test1() { //Arrange Item item = new Item(...); //Act var preview = await Method2(item); //Assert Assert.IsNotNull(preview); } 并更新方法不混合异步和阻塞调用. 如果在调用之后没有使用任务,则Method1不需要asyn / await,因此可以将其删除并让方法返回可以等待的任务 TestServer _owinTestServer; public Task<HttpResponse> Method1(string url,object body) { return _owinTestServer.HttpClient.PostAsJsonAsync(url,body); } Method2需要等待Method1的响应,然后获取其内容. public async Task<ItemPreview> Method2(object body) { var response = await Method1("..",body ); return await response.Content.ReadAsAsync<ItemPreview>(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |