2016-07-29 14 views
5

Ich erstelle einen Windows-Dienst, der mit anderen Prozessen kommuniziert, indem verwendet wird. My Unit-Test für die Named Pipe-Kommunikation wirft diese Fehlermeldung 4mal:So stellen Sie sicher, dass alle von den Tests gestarteten Threads vor dem Abschluss gestoppt werden

System.AppDomainUnloadedException: Versuchte einen unbelasteten AppDomain zuzugreifen. Dies kann vorkommen, wenn der Test einen Thread gestartet hat, aber nicht gestoppt hat. Stellen Sie sicher, dass alle von den Tests gestarteten Threads vor der Fertigstellung gestoppt wurden.

Hier ist mein Unit-Test:

[TestMethod] 
    public void ListenToNamedPipeTest() 
    { 
     var watcher = new ManualResetEvent(false); 

     var svc = new WindowService(); 
     svc.ClientMessageHandler += (connection, message) => watcher.Reset(); 
     svc.ListenToNamedPipe(); 
     sendMessageToNamedPipe("bla"); 
     var wait = watcher.WaitOne(1000); 

     svc.Dispose(); 

     Assert.IsTrue(wait, "No messages received after 1 seconds"); 
    } 

    private void sendMessageToNamedPipe(string text) 
    { 
     var client = new NamedPipeClient<Message, Message>(DeviceCertificateService.PIPE_NAME); 
     client.ServerMessage += (conn, message) => Console.WriteLine("Server says: {0}", message.Text); 

     // Start up the client asynchronously and connect to the specified server pipe. 
     // This method will return immediately while the client runs in a separate background thread. 
     client.Start(); 

     client.PushMessage(new Message { Text = text }); 

     client.Stop(); 
    } 

Wie kann ich alle Threads stoppen, bevor mein Unit-Test nicht mehr reagiert?

Dank


UPDATE:

Die Named Pipe-Client nicht über eine close() Funktion:

// Type: NamedPipeWrapper.NamedPipeClient`2 
// Assembly: NamedPipeWrapper, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null 
// MVID: D2B99F4D-8C17-4DB6-8A02-29DCF82A4118 
// Assembly location: C:\Users\Thang.Duong\Source\Workspaces\Post Tracking System\Applications\Dev\OHD\packages\NamedPipeWrapper.1.5.0\lib\net40\NamedPipeWrapper.dll 

using System; 

namespace NamedPipeWrapper 
{ 
    public class NamedPipeClient<TRead, TWrite> where TRead : class where TWrite : class 
    { 
    public NamedPipeClient(string pipeName); 
    public void Start(); 
    public void PushMessage(TWrite message); 
    public void Stop(); 
    public void WaitForConnection(); 
    public void WaitForConnection(int millisecondsTimeout); 
    public void WaitForConnection(TimeSpan timeout); 
    public void WaitForDisconnection(); 
    public void WaitForDisconnection(int millisecondsTimeout); 
    public void WaitForDisconnection(TimeSpan timeout); 
    public bool AutoReconnect { get; set; } 
    public event ConnectionMessageEventHandler<TRead, TWrite> ServerMessage; 
    public event ConnectionEventHandler<TRead, TWrite> Disconnected; 
    public event PipeExceptionEventHandler Error; 
    } 
} 
+0

Benötigen Sie nicht .close und .dispose auf dem Server und dem Client? – GamerJ5

+0

Weder der Client noch der Server haben eine 'Close()' Funktion. Jeder hat jedoch eine 'Stop()' Funktion. – Believe2014

+0

ManualResetEvent hat einen Abschluss - hast du das versucht? Es sieht so aus, als ob das der einzige Thread ist, den du spawnt. – GamerJ5

Antwort

2

Mein WindowsService erbt die ServiceBase Klasse, die die Dispose() Funktion hat alle schließen Fäden. Deshalb bekomme ich alle Rennfehler.

Ich musste vermeiden, Dispose() Funktion aufrufen und ersetzen Sie sie durch und svc.Close() Funktion. Die svc.Close() Funktion ist meine benutzerdefinierte Implementierung, um den Named Pipes-Server zu beenden und zu schließen.