gpt4 book ai didi

multithreading - 有没有办法限制任务并行库使用的线程?

转载 作者:行者123 更新时间:2023-12-04 20:55:45 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com