2008-09-08 20 views
9

मेरे पास एक डब्ल्यूसीएफ सेवा है जिसमें यूआई घटक शामिल हैं, जो मुझे एसटीए मोड में रहने के लिए मजबूर करता है।डब्ल्यूसीएफ सेवा एसटीए (सिंगल-थ्रेडेड)

मैं सेवा व्यवहार को एसटीए-मोड में कैसे सेट करूं?


सेवा एक WPF DLL फ़ाइल जो चित्र विश्लेषण के लिए एक यूआई विंडो (दृश्य बंदरगाह के रूप में प्रयोग किया जाता) को खोलता है के लिए एक संदर्भ का उपयोग करता है।

बुला धागा एक जाँच

उत्तर

0

मैं [STAThread] विशेषता का उपयोग की जांच करेगा होना चाहिए: जब सेवा है कि आइटम का एक उदाहरण बनाने के लिए कोशिश कर रहा है (खिड़की से विरासत में मिली) यह एक अपवाद फेंकता थ्रेडिंग मॉडल स्विच करने के लिए। उदा।

[STAThread] 
static void Main() 
{ 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new Host() }; 
     ServiceBase.Run(ServicesToRun); 
} 

Description of the STAThread attribute

लेकिन आप बिल्कुल एक वेब सेवा में UI घटक का उपयोग कर रहे मैं उलझन में हूँ। क्या आप इस बारे में कुछ और बता सकते हैं कि आप ऐसा करने का प्रयास क्यों कर रहे हैं?

+1

मुझे पता है कि टिप्पणी थोड़ी देर हो चुकी है, लेकिन फिर भी - इस दृष्टिकोण का उपयोग न करें! असल में, यह फाइनलाइज़र थ्रेड के साथ डेडलॉक का कारण बनता है ताकि अंतिमकरण संसाधनों की रिसाव के कारण काम नहीं करेगा। मैं जल्द ही अधिक जानकारी के साथ यूआरएल जोड़ूंगा। – Mihailo

+0

http://stackoverflow.com/questions/2001667/net-windows-service-needs-to-use-stathread – GregC

1

मैं आपके जैसा कुछ कर रहा हूं।

मेरा समाधान एसटीए थ्रेड कतार के माध्यम से सभी कॉलों को रूट करना था। मैंने एसटीए थ्रेड पर चलने वाली कार्रवाइयों को कतारबद्ध करने के लिए नए parallel framework से थ्रेडसेफ संग्रह का उपयोग किया। तब मेरे पास एसटीए धागे की एक्स संख्या थी जो निष्पादित करने के लिए नए कार्यों के लिए लगातार कतार की जांच करता था।

+1

और, अब, मैं सिर्फ एक कस्टम [सिंक्रनाइज़ेशन कॉन्टेक्स्ट] (http://msdn.microsoft) का उपयोग कर रहा हूं। कॉम/एन-यूएस/पत्रिका/सीसी 163321.aspx # एस 4) अब इसके लिए। बहुत बेहतर समाधान। – Will

0

ServiceBehaviour विशेषता आपको व्यवहार निर्दिष्ट करने की अनुमति देती है। एकल थ्रेड के लिए आपके मामले में आप निम्नलिखित का प्रयोग करेंगे:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 
} 

आप might want to read about differentInstanceContextMode रों आप बेहतर है आप कैसे सेवा व्यवहार करने के लिए चाहते हैं पर चुनने में मदद करने।

आप भी अपनी app.config नई सेवा व्यवहार में जोड़ने के लिए (या एक मौजूदा संपादित करें) की जरूरत है: निम्नलिखित की तरह

<behavior name="wsSingleThreadServiceBehavior"> 
     <serviceThrottling maxConcurrentCalls="1"/> 
    </behavior> 

और एक ही app.config सेट behaviorConfiguration में अपने व्यवहार विन्यास में:

<service behaviorConfiguration="wsSingleThreadServiceBehavior" name="IService"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsEndpointBinding" name="ConveyancingEndpoint" contract="IService" /> 
    </service> 

आशा यह आपको कुछ समय बचाता है

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