2013-05-08 10 views
14

के साथ Async दो-तरफा संचार मेरे पास एक विंडोज़ सेवा है और एक जीयूआई है जिसे एक दूसरे के साथ संवाद करने की आवश्यकता है। या तो किसी भी समय संदेश भेज सकते हैं।विंडोज नामांकित पाइप्स (.NET)

मैं नामांकित पाइप का उपयोग कर रहा हूं, लेकिन ऐसा लगता है कि आप & एक ही समय में स्ट्रीम को लिख नहीं सकते हैं (या कम से कम मुझे इस मामले को कवर करने वाले कोई भी उदाहरण नहीं मिल सकते हैं)।

क्या यह एक ही नामांकित पाइप के माध्यम से इस तरह के दो-तरफा संचार करना संभव है? या मुझे दो पाइप खोलने की ज़रूरत है (एक GUI-> सेवा से और सेवा से एक-> जीयूआई)?

+2

आप इस्तेमाल कर सकते हैं WCF डुप्लेक्स NamedPipes, मैं अपने सेवा/अनुप्रयोग संचार, यहाँ एक अच्छा उदाहरण help.http सकता है के लिए इस विधि का उपयोग: //tech.pro/tutorial/855/wcf-tutorial- बुनियादी-इंटरप्रोसेस-संचार –

उत्तर

25

, ग्राहक वर्ग का उपयोग करना WCF आप द्वैध नामित पाइप का उपयोग कर सकते

// Create a contract that can be used as a callback 
public interface IMyCallbackService 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyClient(); 
} 

// Define your service contract and specify the callback contract 
[ServiceContract(CallbackContract = typeof(IMyCallbackService))] 
public interface ISimpleService 
{ 
    [OperationContract] 
    string ProcessData(); 
} 

सेवा को लागू

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class SimpleService : ISimpleService 
{ 
    public string ProcessData() 
    { 
     // Get a handle to the call back channel 
     var callback = OperationContext.Current.GetCallbackChannel<IMyCallbackService>(); 

     callback.NotifyClient(); 
     return DateTime.Now.ToString(); 
    } 
} 

होस्ट सेवा

class Server 
{ 
    static void Main(string[] args) 
    { 
     // Create a service host with an named pipe endpoint 
     using (var host = new ServiceHost(typeof(SimpleService), new Uri("net.pipe://localhost"))) 
     { 
      host.AddServiceEndpoint(typeof(ISimpleService), new NetNamedPipeBinding(), "SimpleService"); 
      host.Open(); 

      Console.WriteLine("Simple Service Running..."); 
      Console.ReadLine(); 

      host.Close(); 
     } 
    } 
} 

क्लाइंट अनुप्रयोग बनाएँ इस उदाहरण में कॉल बैक कॉन्ट्रैक्ट लागू करता है।

class Client : IMyCallbackService 
{ 
    static void Main(string[] args) 
    { 
     new Client().Run(); 
    } 

    public void Run() 
    { 
     // Consume the service 
     var factory = new DuplexChannelFactory<ISimpleService>(new InstanceContext(this), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/SimpleService")); 
     var proxy = factory.CreateChannel(); 

     Console.WriteLine(proxy.ProcessData()); 
    } 

    public void NotifyClient() 
    { 
     Console.WriteLine("Notification from Server"); 
    } 
} 
+0

विस्तृत प्रतिक्रिया के लिए धन्यवाद। मैं इस विधि के साथ चला गया है, क्योंकि यह 2 नामित पाइप का उपयोग करने से आसान लगता है। –

+0

मुझे यह सुंदर विस्तृत और उपयोगी भी मिला: http://idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx –

+0

कोई भी विचार जो मैं विंडोज़ सेवा को ठीक से चला सकता हूं लेकिन नहीं कर सकता सेवा संदर्भ जोड़ने का प्रयास करते समय सेवा पाएं मुझे 'net.pipe: // localhost/service1' मिलता है। पाइप से पढ़ने में त्रुटि हुई: पाइप समाप्त हो गया है। (109, 0x6d)। –

1

आपके नामित पाइप स्ट्रीम कक्षाओं (सर्वर या क्लाइंट) को इनऑट के पाइप डायरेक्शन के साथ बनाया जाना है। आपको अपनी सेवा में शायद एक नामांकित पाइपसेवरस्ट्रीम की आवश्यकता है, जिसे नामांकित पाइप क्लाइंटस्ट्रीम ऑब्जेक्ट्स की मनमानी संख्या द्वारा साझा किया जा सकता है। पाइप और दिशा के नाम से नामांकित पाइपसेवरस्ट्रीम का निर्माण करें, और पाइप के नाम से नामांकित पाइप क्लाइंटस्ट्रीम, सर्वर का नाम, और पाइप डायरेक्शन, और आपको जाने के लिए अच्छा होना चाहिए।

2

संदेशों को जमा करने के लिए एक बिंदु का उपयोग करना (इस मामले में एक पाइप) आपको संदेश की दिशा को संभालने के लिए मजबूर करता है (इसके अतिरिक्त आपको पाइप के लिए सिस्टम-वाइड लॉक का उपयोग करना होगा)।

तो विपरीत दिशाओं के साथ 2 पाइप का उपयोग करें।

(एक और विकल्प 2 एमएसएमक्यू कतारों का उपयोग करेगा)।

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