加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读