2016-07-29 6 views
5

मैं एक विंडोज सेवा का निर्माण कर रहा हूं जो named pipe का उपयोग करके अन्य प्रक्रियाओं के साथ संचार करता है। नामित पाइप संचार के लिए मेरे इकाई परीक्षण यह त्रुटि संदेश फेंक है 4 बार:यह सुनिश्चित करने के लिए कि परीक्षण (ओं) द्वारा शुरू किए गए सभी थ्रेड पूर्ण होने से पहले बंद हो गए हैं

System.AppDomainUnloadedException: एक उतार AppDomain तक पहुँचने के लिए प्रयास किया गया। यह तब हो सकता है जब परीक्षण (ओं) ने धागा शुरू किया लेकिन इसे रोक नहीं दिया। सुनिश्चित करें कि परीक्षण (ओं) द्वारा शुरू किए गए सभी थ्रेड पूर्ण होने से पहले बंद हो गए हैं।

[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(); 
    } 

मैं पहले अपने इकाई परीक्षण बंद हो जाता है सभी धागे रोक कैसे कर सकता हूँ:

यहाँ मेरी इकाई परीक्षण है?

धन्यवाद


अद्यतन:

// 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

क्या आपको सर्वर और क्लाइंट दोनों पर क्लिक करने की आवश्यकता नहीं है। – GamerJ5

+0

न तो ग्राहक या सर्वर के पास 'बंद करें)' फ़ंक्शन है। प्रत्येक के पास 'रोकें()' फ़ंक्शन है। – Believe2014

+0

मैनुअल रीसेट इवेंट पास है - क्या आपने कोशिश की? ऐसा लगता है कि यह एकमात्र धागा है जिसे आप पैदा कर रहे हैं। – GamerJ5

उत्तर

2

मेरे WindowsServiceServiceBase वर्ग Dispose() समारोह सब बंद करने के लिए है जो विरासत में:

नामित पाइप ग्राहक एक close() समारोह नहीं है धागे। यही कारण है कि मुझे सभी रेसिंग त्रुटियां मिलती हैं।

मुझे Dispose() फ़ंक्शन को कॉल करने से बचने और client.Close() और svc.Close() फ़ंक्शन के साथ प्रतिस्थापित करना पड़ा। svc.Close() फ़ंक्शन नामित पाइप सर्वर को रोकने और बंद करने के लिए मेरा कस्टम कार्यान्वयन है।

संबंधित मुद्दे

 संबंधित मुद्दे