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

标签 multithreading unit-testing concurrency .net-4.0 task-parallel-library

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

相关文章:

java - 如何使用私有(private)方法调用 Mockito.given

iphone - 在两个线程上使用 NSPrivateQueueConcurrencyType 托管对象上下文时出现死锁

.net - .Net Framework 中的哪个线程安全集合将 “Contains” 作为其 API 之一?

c - 有没有什么可以阻止 CPU 在执行其预定的设置操作之前等待很长时间?

multithreading - Clojure - 构建直播服务器的方式 - 有 promise ,但它是正确的方式

python - 如何跳过 DRF 单元测试中的方法调用?

javascript - sinon.js stub - 如何 stub async.map

java - 线程通过调用interrupt()被中断,但是Thread.isInterrupted()返回false

C#多线程无符号递增

ruby - 是否可以确保线程代码在 Ruby 中没有副作用?