Как обеспечить изменение потока при выполнении async / await? - PullRequest
0 голосов
/ 24 мая 2019

При выполнении await Task может или не может быть выполнен в том же потоке. Обычно нам просто нужно принять этот факт во внимание при проектировании. Но я хотел бы сделать тест специально для сценария изменения потока - как мне убедиться, что остальная часть асинхронного метода (после ожидания) запущена в другом потоке?

Возможное решение:

    [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));
    }

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

как мне убедиться, что остальная часть асинхронного метода (после ожидания) запущена в другом потоке?

Сначала убедитесь, что вы вызываете тестируемый метод из контекста пула потоков. Некоторые инфраструктуры модульных тестов предоставляют однопоточный контекст. Если это так, то вы захотите обернуть свой тестовый код в await Task.Run(() => ...).

Затем смоделируйте ожидаемый метод и убедитесь, что он выполняет await Task.Yield(); это гарантирует, что await в тестируемом методе получит незавершенную задачу, что приведет к его возобновлению в потоке пула потоков.

Если вы хотите быть абсолютно уверенным в том, что он возобновляется в другом потоке пула потоков, вам необходимо заблокировать метод модульного тестирования для тестируемого метода, чтобы текущий поток пула потоков заблокирован и не используется для возобновления тестируемого метода.

3 голосов
/ 24 мая 2019

Вы не можете. Асинхронный шаблон предназначен для упрощения асинхронного (duh) кода за счет некоторого контроля. Если вам нужно контролировать создание потоков, используйте Thread / ThreadPool.

...