【问题标题】:Waiting on All Task Threads without having the Task Object在没有任务对象的情况下等待所有任务线程
【发布时间】:2017-05-09 12:37:48
【问题描述】:

我有一个使用.NET 4.0 的应用程序(所以没有async/await 可用)。我正在为使用服务调用的方法编写测试。

例如,我的测试调用method AMethod A 有一个对 method B 的异步服务调用,它返回一个 Task,我们在 ContinueWith 中进行所有处理。 Method A 不返回任何内容。

问题是主线程在ContinueWith 有机会完成之前到达Assert 调用,因此测试失败。

目前解决此问题的方法是执行Thread.Sleep(10),以便ContinueWith 有时间执行。然而,这会带来很多问题,例如在较慢的机器上测试失败会浪费时间(当有数百个 - 数千个测试时,这会增加)。

我想知道是否有任何方法可以在没有 Task 对象的情况下执行某种 Thread.WaitAll(),因为无法获取它们。选项,因此必须从测试中完成。

注意:如果我们有 Task/Thread 对象,我知道执行此操作的方法,但我无权访问它们,因此请不要将其标记为与这些对象重复不是。

【问题讨论】:

  • 我认为您需要在这里做与async/await 相同的事情,即让Tasks 冒泡。您是否有理由不能让 Mathod A 返回由 ContinueWith 产生的任务,以便调用者可以决定等待它?
  • 你不能让Method AContinueWith返回Task吗?
  • 另外,要指出 Task 和 async/await 是两个不同的东西。 Task 自 4.0 以来是 .NET 的一部分,可以在没有异步的情况下使用。它只是 async/await 使它使用起来更容易。
  • 我相信您的测试已经向您表明您的实现存在缺陷。如果您需要在测试中等待任务完成,那么很明显您可能需要在现实生活中等待相同的任务。如果这是您的方案,则不返回任务是错误的选择。
  • “实现对我们的需要来说很好” - 如果你在编写一个简单的测试时遇到问题,这似乎不是真的。

标签: c# multithreading asynchronous c#-4.0 continuewith


【解决方案1】:

我想知道是否有任何方法可以在没有实际拥有 Task 对象的情况下执行某种 Thread.WaitAll(),因为无法获取它们。

不,没有办法可靠地做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多