【问题标题】:why does awaiter.IsCompleted always return false?为什么 awaiter.IsCompleted 总是返回 false?
【发布时间】:2020-05-01 06:52:43
【问题描述】:

我是 .NET 新手,正在编写一个测试程序。现在我正在使用 TaskAwaiter,当我从它的实例中获取 awaiter 时,它总是在 awaiter.IsCompleted 上返回 false,我不知道为什么以及如何要解决这个问题?是不是我用错了?

TaskAwaiter<HttpResponseMessage> awaiter;
str = "login.action";
awaiter = client.client.GetAsync(str).GetAwaiter();
if (awaiter.IsCompleted)
{
  break;
}

【问题讨论】:

  • 您为什么希望它立即完成? (如果 GetAsync 实际上是同步的,它就会完成,但仅此而已。)异步操作的全部意义在于您启动某些东西,然后可以等待它完成。如果它总是立即完成,它就不是真正的异步。
  • @JonSkeet 但是我们什么时候才能知道它已经完成了?
  • 通过注册完成处理程序。但是无论如何,您应该很少直接与等待者打交道——您通常只是等待任务。

标签: c# .net async-await client httpclient


【解决方案1】:

我是不是用错了?

您假设 HTTP 请求立即发生。不是这种情况。你必须等待它。

在某些极端情况下,被调用的异步方法可能不是异步的 - 即返回缓存的结果 - 只有这些情况你会在调用后立即获得 IsCompleted = true。

【讨论】:

  • 谢谢你的回答。如果我把它放在像'while(!awaiter.IsCompleted)'这样的while循环中,它会解决这个问题吗?
  • 或者你只是等待它。看看awaiter里面的方法就知道了。
【解决方案2】:

您似乎没有正确的循环定义。 应该是这样的:

TaskAwaiter<HttpResponseMessage> awaiter;
str = "login.action";
awaiter = client.client.GetAsync(str).GetAwaiter();
while (true)
{
  if (awaiter.IsCompleted)
  {
    break;
  }
}

或者这样写会更好: while (!awaiter.IsComleted) {}

或者最好的做法是使用async/await 关键字。例如:

public async Task YourMethodName()
{
  ...
  str = "login.action";
  HttpResponseMessage response = await client.client.GetAsync(str);
  ...
}

【讨论】:

  • 当然可以。但是使用这样的结构绝对是可怕的事情。这意味着无论如何你都会等待5秒。但也许你的回复会在半秒内收到。所以你会浪费 4+ 秒。
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多