首页 > 解决方案 > 执行异步/等待时如何确保线程更改?

问题描述

执行awaitTask可以或不能在同一线程上执行。通常,我们只需要将这一事实纳入设计考虑。但是我想专门针对线程更改场景进行测试-如何确保其余的异步方法(在等待之后)在不同的线程上运行?

可能的解决方案:

    [Test]
    public void TestForThreadChange()
    {
        int threadIdBefore, threadIdAfter = 0;

        async Task AsyncFunction()
        {
            Console.WriteLine($"before - {threadIdBefore = Thread.CurrentThread.ManagedThreadId}");
            await Task.Yield();
            Console.WriteLine($"after - {threadIdAfter = Thread.CurrentThread.ManagedThreadId}");
        }

        AsyncFunction().Wait();

        Assert.That(threadIdBefore, Is.Not.EqualTo(threadIdAfter));
    }

标签: c#.netasync-awaittask-parallel-library

解决方案


如何确保其余的异步方法(等待之后)在不同的线程上运行?

首先,确保您已从线程池上下文调用正在测试的方法。一些单元测试框架确实提供了单线程上下文。如果是这种情况,您需要将测试代码包装在await Task.Run(() => ...).

然后,模拟正在等待的方法并确保它执行await Task.Yield(); 这将确保await在被测方法中将获得不完整的任务,导致它在线程池线程上恢复。

如果您想绝对确定它在不同的线程池线程上恢复,您需要在正在测试的方法上阻止您的单元测试方法,以便当前线程池线程被阻止并且不用于恢复正在运行的方法测试。


推荐阅读