2012-09-21 14 views
5

काम नहीं कर रहा है मैंने डब्ल्यूसीएफ के लिए एक आरईएसटी सेवा लागू की है। यह सेवा एक ऐसे फ़ंक्शन प्रदान करती है जिसे कई क्लाइंट द्वारा बुलाया जा सकता है और इस फ़ंक्शन को पूरा होने में 1 मिनट से अधिक समय लगता है। तो मैं क्या चाहता था कि प्रत्येक ग्राहक के लिए, एक नई वस्तु का उपयोग किया जाता है, ताकि एक समय में कई ग्राहकों को संभाला जा सके।डब्ल्यूसीएफ आरईएसटी सेवा: InstanceContextMode.PerCall

मेरे इंटरफेस इस तरह दिखता है:

[ServiceContract] 
public interface ISimulatorControlServices 
{ 
    [WebGet] 
    [OperationContract] 
    string DoSomething(string xml); 
} 

और (परीक्षण) यह के कार्यान्वयन:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall] 
public class SimulatorControlService : SimulatorServiceInterfaces.ISimulatorControlServices 
{ 
    public SimulatorControlService() 
    { 
     Console.WriteLine("SimulatorControlService started."); 
    } 

    public string DoSomething(string xml) 
    { 
     System.Threading.Thread.Sleep(2000); 
     return "blub"; 
    } 
} 

समस्या अब है: अगर मैं एक ग्राहक है कि 10 बनाता का उपयोग (या जो भी संख्या) धागे, जिनमें से प्रत्येक सेवा को बुलाता है, वे एक साथ नहीं चलते हैं। इसका मतलब है, कॉल एक-दूसरे के बाद एक को संभाला जा रहा है। क्या किसी के पास कोई विचार है कि ऐसा क्यों होता है?

जोड़ा गया: क्लाइंट-साइड कोड

Spawning धागे:

 for (int i = 0; i < 5; i++) 
     { 
      Thread thread = new Thread(new ThreadStart(DoSomethingTest)); 
      thread.Start(); 
     } 

विधि:

private static void DoSomethingTest() 
    { 
     try 
     { 
      using (ChannelFactory<ISimulatorControlServices> cf = new ChannelFactory<ISimulatorControlServices>(new WebHttpBinding(), "http://localhost:9002/bla/SimulatorControlService")) 
      { 
       cf.Endpoint.Behaviors.Add(new WebHttpBehavior()); 

       ISimulatorControlServices channel = cf.CreateChannel(); 

       string s; 

       int threadID = Thread.CurrentThread.ManagedThreadId; 

       Console.WriteLine("Thread {0} calling DoSomething()...", threadID); 

       string testXml = "test"; 

       s = channel.StartPressureMapping(testXml); 

       Console.WriteLine("Thread {0} finished with reponse: {1}", threadID, s); 
      } 

     } 
     catch (CommunicationException cex) 
     { 
      Console.WriteLine("A communication exception occurred: {0}", cex.Message); 
     } 
    } 

अग्रिम धन्यवाद!

+0

आप क्लाइंट के अनुरोध कैसे उत्पन्न करने वाला कर रहे हैं? क्या आप उस पर कुछ कोड दिखा सकते हैं? ध्यान दें कि आप विवरण जोड़ने के लिए अपना प्रश्न संपादित कर सकते हैं। – Jeroen

+0

क्लाइंट-साइड कोड जोड़ा गया। – Cleo

+0

यदि आपकी सेवा साझा संसाधनों का उपयोग नहीं करती है तो आप सेवा ब्रह्मांड को सिंगल को कंसुरेंसी एकाधिक के साथ बदल सकते हैं। यह आपको एक सेवा इंस्टेंस देगा, जो बहु थ्रेडेड (प्रत्येक कॉल के लिए एक थ्रेड) है। '[ServiceBehavior (InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]' – JanW

उत्तर

1

के बाद से सेवा एक जीयूआई द्वारा नियंत्रित किया जाता, "UseSynchronizationContext" विशेषता समस्या को हल करने की जरूरत थी:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Multiple, UseSynchronizationContext=false)] 
संबंधित मुद्दे