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

前端之家收集整理的这篇文章主要介绍了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>();
}

猜你在找的C#相关文章