作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 TPL,但我发现使用它的单元测试代码很棘手。
我试图不 introduce a wrapper我觉得它可能会带来问题。
我知道您可以在 TPL 中设置处理器关联,但真正好的是设置线程最大值(可能是每个应用程序域)。因此,当将线程最大值设置为 1 时,TPL 将被迫使用它所使用的任何线程。
你怎么认为?这可能吗(我很确定不可能),应该可能吗?
编辑:这是一个例子
public class Foo
{
public Foo( )
{
Task.Factory.StartNew( () => somethingLong( ) )
.ContinueWith( a => Bar = 1 ) ;
}
}
[Test] public void Foo_should_set_Bar_to_1( )
{
Assert.Equal(1, new Foo( ).Bar ) ;
}
Task.MaximumThreads=1
的东西这样 TPL 将串行运行。
最佳答案
您可以创建自己的 TaskScheduler
派生自 TaskScheduler
的类,将其传递到 TaskFactory
.现在您可以拥有任何 Task
您创建的对象针对该调度程序运行。
无需将其设置为使用一个线程。
然后,就在您的断言之前,只需调用 Dispose()
在上面。如果您按照示例编写 TaskScheduler
,它会在内部执行类似的操作。 :-
public void Dispose()
{
if (tasks != null)
{
tasks.CompleteAdding();
foreach (var thread in threads) thread.Join();
tasks.Dispose();
tasks = null;
}
}
ContinueWith(...)
如果您想在事情发生时检查进度,则在任务运行后添加断言。
关于multithreading - 有没有办法限制任务并行库使用的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3548425/
我是一名优秀的程序员,十分优秀!