Pergunta

Existe uma maneira de teste de unidade WaitHandle.WaitAll() quando utilizar o Visual Studio embutido na unidade de solução de teste.Quando tento executar um teste que usa esta função dentro do Visual Studio o teste falhar e, ao analisar os resultados do teste é apresentado o seguinte erro:

WaitAll for multiple handles on a STA thread is not supported

Eu gostaria de ser capaz de teste de unidade o uso de WaitAll() desde que uma quantidade crescente de meu API da base de código é agora a mover-se para uma IAsyncResult padrão, em oposição a outros meios de fazer o multi-threaded operações.

Editar

Com base em Anthony sugestão aqui é um simples método auxiliar que pode ser usado para invocar esse código em um ambiente de teste de unidade:

public static void TestInMTAThread(ThreadStart info)
{
    Thread t = new Thread(info);
    t.SetApartmentState(ApartmentState.MTA);
    t.Start();
    t.Join();
}
Foi útil?

Solução

Você pode ter dois problemas.O primeiro é o que você afirmou:Você não pode esperar vários Esperar Alças em um thread STA (o MSTest thread de apartamento estado).Nós podemos consertar isso com um criado manualmente thread MTA.

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

O meio ambiente também tem um espera máximo limite de identificador.Em .NET 2.0, parece ser difícil codificado para 64.Esperando mais do que o limite vai produzir um NotSupportedException.Você pode usar um extensão método para aguardar que todas aguarde alças em pedaços.

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

E você rig-los juntos como este no seu teste (no Ato ou Afirmar parte do teste)

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

Outras dicas

No O Visual Studio 2008 E 2010 você pode alterar o seu .testsettings arquivo para executar os testes em um thread MTA adicionando <ExecutionThread apartmentState="MTA" />.

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

Para o meu Visual Studio 2010, apenas a seguinte configuração feitos testes de trabalho.

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

Para o VS2008 as instruções são um pouco diferente em comparação com VS2010.Para o VS2008, edite o testrunconfig arquivo e adicione o seguinte para o TestRunConfiguration elemento:

<ExecutionThread apartmentState="MTA" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top