Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Task.Wait() блокирует средство запуска Xamarin.iOS NUnit

Автор вопроса: jonathanpeppersОтветов: 1

У меня есть класс с такими методами:

private Task Sleep()
{
    return Task.Delay(SleepDuration);
}

public async Task<User> Login(string username, string password)
{
    await Sleep();

    return new User { Id = 1, Username = username };
}

Обратите внимание, что во время моих тестов SleepDuration установлено на 0.

Если я вызову следующее в тесте проекта iOS NUnit:

myClass.Login("username", "password").Wait();

Пользовательский интерфейс тестировщика приостанавливается и никогда не завершается. Если я добавлю точки останова, код никогда не достигнет строки после await. Тот же тест отлично работает в стандартном средстве запуска NUnit в проекте .Net 4.5 Mono. Это также отлично работает в моем приложении, хотя я никогда не вызываю Wait и всегда использую async/await.

Любые идеи? Есть ли что-то еще, что я могу использовать вместо Task.Delay, чтобы предотвратить взаимоблокировку? Я уже пробовал Task.Factory.StartNew(() => { }).

xamarinunit-testingnunit

Ответы

Ответ 1 · рейтинг 2 · Stephen Cleary

Современные версии NUnit предоставляют SynchronizationContext для своих модульных тестов, чтобы они могли поддерживать модульные тесты async void.

Вполне вероятно, что этот контекст вызывает взаимоблокировку, когда вы блокируете асинхронный код (например, Wait). У меня есть запись в блоге, в которой подробно описывается взаимодействие а>. Обратите внимание, что эта взаимоблокировка происходит только в том случае, если Task.Delay возвращает еще не завершенное Task; для очень коротких задержек существует условие гонки, независимо от того, завершена ли Task к тому времени, когда она достигает Wait.

Я рекомендую вам использовать await в модульном тесте и сделать тестовый метод async Task.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы