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;
}
}
Benötigen Sie nicht .close und .dispose auf dem Server und dem Client? – GamerJ5
Weder der Client noch der Server haben eine 'Close()' Funktion. Jeder hat jedoch eine 'Stop()' Funktion. – Believe2014
ManualResetEvent hat einen Abschluss - hast du das versucht? Es sieht so aus, als ob das der einzige Thread ist, den du spawnt. – GamerJ5