Как использовать WaitHandler.WaitAll в MSTest без предупреждений STA?

StackOverflow https://stackoverflow.com/questions/3246207

Вопрос

Есть ли способ модульного тестирования WaitHandle.WaitAll() при использовании встроенного решения для модульного тестирования Visual Studio.Когда я пытаюсь запустить тест, использующий эту функцию в Visual Studio, тест завершается неудачей, и при проверке результатов теста отображается следующая ошибка:

WaitAll for multiple handles on a STA thread is not supported

Я хотел бы иметь возможность модульного тестирования использования WaitAll() поскольку все большая часть кодовой базы моего API теперь переходит на IAsyncResult шаблон в отличие от других средств выполнения многопоточных операций.

Редактировать

Основываясь на предложении Энтони, вот простой вспомогательный метод, который можно использовать для вызова такого кода в среде модульного тестирования:

public static void TestInMTAThread(ThreadStart info)
{
    Thread t = new Thread(info);
    t.SetApartmentState(ApartmentState.MTA);
    t.Start();
    t.Join();
}
Это было полезно?

Решение

У вас могут быть две проблемы.Первый - тот, который вы заявили: вы не можете дождаться нескольких ручек ждать В потоке STA (МСТю нитью квартиру).Мы можем исправить это с вручную, созданной резьбой MTA.

public static void OnMtaThread(Action action)
{
    var thread = new Thread(new ThreadStart(action));
    thread.SetApartmentState(ApartmentState.MTA);
    thread.Start();
    thread.Join();
}
.

Окружающая среда также имеет максимальный лимит ручки ожидания .В .NET 2.0, кажется, сложно закодирован до 64. Ожидание больше, чем предел будет производить генеракодицетагкод.Вы можете использовать Расширение Метод ждать, чтобы ждать всех подкуп в кусках.

public static void WaitAll<T>(this List<T> list, TimeSpan timeout)
    where T : WaitHandle
{
    var position = 0;
    while (position <= list.Count)
    {
        var chunk = list.Skip(position).Take(MaxWaitHandles);
        WaitHandle.WaitAll(chunk.ToArray(), timeout);
        position += MaxWaitHandles;
    }
}
.

и вы собираете их вместе, как это в вашем тесте (в акте или утверждении, часть теста)

OnMtaThread(() => handles.WaitAll(Timespan.FromSeconds(10)));
.

Другие советы

В Визуальная Студия 2008 и 2010 гг. ты можешь изменить свой .testsettings файл для запуска тестов в потоке MTA, добавив <ExecutionThread apartmentState="MTA" />.

<Execution>
     <ExecutionThread apartmentState="MTA" />
</Execution>

Для моей Visual Studio 2010 работает только следующие тесты на конфигурацию.

<Execution>
     <ExecutionThread apartmentState="1" />
</Execution>
.

Для VS2008 Инструкции немного отличаются по сравнению с VS2010.Для VS2008 отредактируйте файл testrunconfig и добавьте следующее в элемент testrunconfiguration:

<ExecutionThread apartmentState="MTA" />
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top