STA 경고없이 MSTEST에서 WAISHANDLER.WAITALL을 사용하려면 어떻게해야합니까?
-
15-09-2020 - |
문제
Visual Studio의 기본 제공 단위 테스트 솔루션을 사용할 때 유닛 테스트를 테스트하는 방법이 있습니다.Visual Studio 에서이 기능을 사용하는 테스트를 시도하고 실행하면 테스트가 실패하고 테스트 결과를 검사 할 때 다음 오류가 표시됩니다.
WaitAll for multiple handles on a STA thread is not supported
.
멀티 스레드 작업을 수행하는 다른 수단이 아닌 다른 API의 코드 기반이 WaitHandle.WaitAll()
패턴으로 이동 한 이래 WaitAll()
의 사용을 단위 테스트 할 수 있기를 원합니다.
편집
Anthony의 제안을 기반으로 한 것은 단위 테스트 환경에서 이러한 코드를 호출하는 데 사용할 수있는 간단한 도우미 방법입니다.
public static void TestInMTAThread(ThreadStart info)
{
Thread t = new Thread(info);
t.SetApartmentState(ApartmentState.MTA);
t.Start();
t.Join();
}
. 해결책
두 가지 문제가있을 수 있습니다.첫 번째는 당신이 명시한 것입니다. 당신이 명시한 것입니다 : 여러 대기 핸들을 기다릴 수 없습니다 STA 스레드 (MSTEST 나사 아파트 상태)에서.우리는 수동으로 생성 된 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로 하드 코딩 된 것으로 보입니다. 한계 이상을 기다리면 NotSupportedException
가 생성됩니다. 확장 메소드를 사용할 수 있습니다.
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)));
. 다른 팁
"Nofollow"> Visual Studio 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" />
.