等到所有任务完成单元测试我有这个类,我想做单元测试:publicclassSomeClass{publicvoidFoo(){Bar();}privatevoidBar(){Task.Factory.StartNew(()=>{//做一些需要一些时间的事情(例如HTTP请求)});这是我的单元测试的样子:[TestMethod]publicvoidTestFoo(){//Arrangevarobj=newSomeClass();//行为对象。富();对象。富();对象。富();//断言/*我需要等待所有任务完成*/Assert.IsTrue(...);所以,我需要让单元测试线程等到Bar方法中启动的所有任务都完成它们的工作,然后再开始我的断言。重要说明:我无法更改SomeClass我该怎么做?解决此问题的一种方法是以允许您跟踪嵌套任务完成情况的方式定义您自己的任务调度程序。例如,您可以定义一个同步执行任务的调度程序,如下所示:classSynchronousTaskScheduler:TaskScheduler{}protectedoverrideboolTryExecuteTaskInline(Tasktask,boolwasPreviouslyQueued){returnthis.TryExecuteTask(task);}protectedoverrideIEnumerableGetScheduledTasks(){yieldbreak;然后创建这个同步任务调度程序的一个实例并用于执行根任务,产生所有“隐藏”任务。由于嵌套任务从它们的父级继承当前任务调度器,所有内部任务也将在我们的同步调度器上运行,这意味着我们最外层的StartNew调用只会在所有任务完成时返回。TaskScheduler调度器=newSynchronousTaskScheduler();Task.Factory.StartNew(()=>{//安排varobj=newSomeClass();//执行obj.Foo();obj.Foo();obj.Foo();},CancellationToken.None,TaskCreationOptions.无,调度程序);//断言/*我需要等待所有任务完成*/Assert.IsTrue(...);这种方法的缺点是您将失去所有任务的并发性;但是,您可以通过将自定义调度程序增强为并发调度程序来解决这个问题,但仍然允许您跟踪正在执行的任务。Task.WaitAll(the,list,of,task,objects,you,need,to,wait,on);如果是voidasync方法,那你就不行了。设计坏了。他们只是为了火而忘记了它。不确定是否允许您进行此更改,但我这样做是可行的:以上是C#学习教程:等待所有任务完成单元测试完整内容,是否对每个人都有用,需要了解更多关于C#学习教程,希望大家多多关注——namespaceParallelProgramming.Playground{publicclassSomeClass{publicTaskFoo(){returnBar();}privatestaticTaskBar(){returnTask.Factory.StartNew(()=>{Console.WriteLine("我开火了。线程ID:{0}",Thread.CurrentThread.ManagedThreadId);Thread.Sleep(5000);returntrue;//或者你想要的任何其他东西。});}}[TestClass]publicclassStackOverflow{[TestMethod]publicvoidTestFoo(){//排列varobj=newSomeClass();varresults=newConcurrentBag();varwaitForMe=Task.Factory.StartNew(()=>{//执行results.Add(obj.Foo());results.Add(obj.Foo());results.Add(obj.Foo());返回真;});任务.WaitAll(waitForMe);//断言/*我需要等待所有任务完成*/Assert.IsTrue(waitForMe.Result);Assert.AreEqual(3,results.Count);}}}本文收集自网络,不代表顶一下,如涉及侵权请点击维权联系管理员删除如转载请注明出处:
