【问题标题】:Async / await issue, getting "A task was canceled."异步/等待问题,收到“任务已取消”。
【发布时间】:2014-05-07 18:49:00
【问题描述】:

我的 SDK 中有以下代码行。

public async Task<Object> DoSomething(String v1, string v2)
{
   ......
   var response = await _restClient.DeleteAsync<Object, ISomeAPIError>(endpoint)
   ......
}

当我的测试代码使用 async 和 await 模式时,此代码可以正常工作

[TestMethod]
public async Task Test_DomeSomething()
{
   ......
   await x.DoSomething("x", "y");
   ......
}

但是当我以非 aync 方式编写相同的测试时,我得到“任务被取消”。

[TestMethod]
public void Test_DomeSomething_Non_Async()
{
   ......
   x.DoSomething("x", "y");
   ......
}

所以,一个通过,另一个失败。我不希望我的客户端代码强制非异步,也不想将我的 SDK 更改为使用 .Result 并使其非异步。

在网上搜索说要设置 timeout 属性,但这没有意义,因为它已经设置了超过一分钟,并且其中一个测试正在运行。

有什么建议吗?

【问题讨论】:

  • 我相信那是因为你真的希望DoSomething 返回void
  • 我想取回一些值。只是为了遵循您的建议,即使我将方法签名更改为返回 void 它也失败并出现相同的错误。公共异步任务 DoSomething(字符串 v1,字符串 v2)
  • 如果你的代码是异步的,那么它的调用者应该是异步的。无需尝试强制“同步”调用。
  • 不能x.DoSomething().Wait()等待任务吗?

标签: c# task async-await


【解决方案1】:

await 不会使您的代码异步。使用异步函数使其异步。 await 只是暂停包含方法,直到等待的任务完成。

因此,我可以说您不了解await 的基础知识。在不了解的情况下使用技术是危险的。

您不能通过省略 await 来使任何调用同步。如果没有await,异步调用只会“在后台”运行并与其余代码同时运行。谁知道会发生什么。并发是危险的。

我不知道该向您推荐什么。也许你应该只使用await。有什么理由不能吗?

【讨论】:

  • 我正在使用 await,当我的测试方法 Test_DomeSomething 也使用 async\await 模式时它工作正常。但是当我的测试方法不使用 async\await Test_DomeSomething_Non_Async 时它会失败。我想看看是否有什么我可以在 SDK 中使其同时工作的同步和异步。
  • 当然失败了。确保您了解为什么。如果你连基础知识都不知道,我不知道该告诉你什么。为什么它也必须同步工作?
  • 我同意你的看法。我的首席开发人员希望这样。但现在他很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2020-04-23
  • 1970-01-01
  • 2014-09-06
  • 2016-10-15
相关资源
最近更新 更多