【发布时间】:2017-05-09 12:37:48
【问题描述】:
我有一个使用.NET 4.0 的应用程序(所以没有async/await 可用)。我正在为使用服务调用的方法编写测试。
例如,我的测试调用method A。 Method 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 A从ContinueWith返回Task吗? -
另外,要指出 Task 和 async/await 是两个不同的东西。 Task 自 4.0 以来是 .NET 的一部分,可以在没有异步的情况下使用。它只是 async/await 使它使用起来更容易。
-
我相信您的测试已经向您表明您的实现存在缺陷。如果您需要在测试中等待任务完成,那么很明显您可能需要在现实生活中等待相同的任务。如果这是您的方案,则不返回任务是错误的选择。
-
“实现对我们的需要来说很好” - 如果你在编写一个简单的测试时遇到问题,这似乎不是真的。
标签: c# multithreading asynchronous c#-4.0 continuewith