STA 경고없이 MSTEST에서 WAISHANDLER.WAITALL을 사용하려면 어떻게해야합니까?

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

문제

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" />
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top