C# · 12月 22, 2021

c# – 尽管任务已完成,但Task.Wait始终返回false

我正在使用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>();}