Pregunta

Es allí una manera a prueba de unidad WaitHandle.WaitAll() cuando se utiliza Visual Studio en la unidad de pruebas de la solución.Cuando intento ejecutar una prueba que utiliza esta función dentro de Visual Studio, la prueba falla y cuando se examinan los resultados de la prueba se muestra el siguiente error:

WaitAll for multiple handles on a STA thread is not supported

Me gustaría ser capaz de unidad de prueba de la utilización de WaitAll() dado que una cantidad cada vez mayor de mi el código de la API de base se está moviendo a una IAsyncResult patrón frente a otros medios de hacer multi-threaded operaciones.

Editar

Basado en Anthony sugerencia aquí es un simple método auxiliar que puede ser utilizado para invocar ese código en un entorno de prueba de unidades:

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

Solución

Usted puede tener dos problemas.La primera es la que declaró:Usted no puede esperar por varios Esperar Asas en un subproceso STA (el MSTest hilo de estado del apartamento).Podemos arreglar esto con un manual creado MTA hilo.

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

El medio ambiente también tiene un de espera máximo límite de control.En .NET 2.0, parece ser codificado a 64.A la espera de más que el límite que se va a producir un NotSupportedException.Usted puede utilizar un la extensión de método para esperar a que todos esperan mangos en trozos.

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

Y había un aparejo de ellos juntos como esto en su prueba (en el Acto, o hacer parte de la prueba)

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

Otros consejos

En Visual Studio 2008 Y 2010 usted puede cambiar su .testsettings archivo para ejecutar las pruebas en virtud de un MTA hilo por la adición de <ExecutionThread apartmentState="MTA" />.

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

Para mi Visual Studio 2010, solo la siguiente configuración pruebas de trabajo.

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

Para VS2008 las instrucciones son un poco diferentes en comparación con VS2010.Para VS2008, editar el archivo testrunconfig, y agregue lo siguiente a la TestRunConfiguration elemento:

<ExecutionThread apartmentState="MTA" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top