Domanda

C'è un modo per testare l'unità WaitHandle.WaitAll() quando si utilizza la soluzione di test dell'unità integrata di Visual Studio.Quando provo ed eseguito un test che utilizza questa funzione all'interno di Visual Studio, il test non riesce e quando si esaminano i risultati del test viene visualizzato il seguente errore:

WaitAll for multiple handles on a STA thread is not supported
.

Mi piacerebbe essere in grado di testare l'uso dell'utilizzo di WaitAll() poiché una quantità crescente della base di codice dell'API si sta ora spostando in un modello IAsyncResult in contrapposizione ad altri mezzi per fare operazioni multi-thread.

Modifica

Sulla base del suggerimento di Anthony qui è un semplice metodo di helper che può essere utilizzato per invocare tale codice in un ambiente di test unitario:

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

È stato utile?

Soluzione

Potresti avere due problemi.Il primo è quello che hai dichiarato: non puoi aspettare su più maniglie di attesa in un filo STA (lo stato dell'appartamento del thread Mstems).Possiamo risolverlo con un filo MTA creato manualmente.

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

L'ambiente ha anche un Limite massimo della maniglia di attesa .In .NET 2.0, sembra essere codificato a 64 anni. Aspettare su più del limite produrrà un NotSupportedException.Puoi usare un Estensione Metodo per attendere tutte le maniglie di attesa in blocchi.

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 li avresti sistemato insieme come questo nel tuo test (nell'atto o nella parte della parte del test)

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

Altri suggerimenti

in Visual Studio 2008 e 2010 È possibile modificare il file .testsettings per eseguire i test sotto un thread MTA aggiungendo <ExecutionThread apartmentState="MTA" />.

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

Per il mio studio Visual Studio 2010 solo i seguenti test effettuati configurati funzionano.

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

Per VS2008 Le istruzioni sono leggermente diverse rispetto a VS2010.Per VS2008, modificare il file TestrunConfig e aggiungi il seguente all'elemento TestrunConfiguration:

<ExecutionThread apartmentState="MTA" />
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top