2009-09-16 22 views
5

क्या कोई नया आने वाला अनुरोध संभालने के लिए एक नया थ्रेड बनाने के लिए डब्ल्यूसीएफ सेवा को कॉन्फ़िगर करने का कोई तरीका है?डब्ल्यूसीएफ सेवा जो हर नए अनुरोध के लिए एक नया धागा बनाता है

+2

क्या यह डब्लूसीएफ पहले से ही ऐसा नहीं कर रहा है? – Jehof

+0

नहीं, डिफ़ॉल्ट रूप से नहीं – Nazgul

उत्तर

0

नहीं, क्योंकि आप कभी ऐसा नहीं करना चाहते हैं। आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं?

संपादित

अधिक जानकारी में आ रहा है, इसके आधार पर मैं क्या सोचता है।

यदि आप प्रति अनुरोध "चिपचिपा राज्य" चाहते हैं, तो आपको इंस्टेंस पर राज्य का उपयोग करना चाहिए और InstcContextMode.PerCall का उपयोग Marc_s की प्रतिक्रिया के अनुसार करना चाहिए।

यदि आपको अपने कॉल के लिए थ्रेड-लोकल स्टोरेज में कुछ राज्य की आवश्यकता है, तो आप ICallContextInitializer का उपयोग उस राज्य को मार्शल करने के तरीके के रूप में करने के तरीके के रूप में कर सकते हैं जिस पर डब्ल्यूसीएफ आपकी विधि का आह्वान करना चुनता है (और थ्रेड स्टेटस को साफ़ करता है) जब कॉल खत्म हो जाता है)।

लेकिन आपको "कौन सा धागा" परवाह नहीं करना चाहिए। डब्ल्यूसीएफ आपकी ओर से एक थ्रेड पूल के साथ संभाल लेंगे।

+0

क्या आप थोड़ा और समझा सकते हैं? –

+0

विचार थ्रेड कॉन्टेक्स्ट में इन्हें संग्रहीत करके अनुरोध के भीतर डीबी सत्र, प्रमाण-पत्र आदि साझा करना है। यह रोलबैक करने में हमारी मदद करेगा, आदि – Nazgul

+0

बेशक आप कर सकते हैं - यह वास्तव में भी सिफारिश की सर्वोत्तम अभ्यास है! सर्विसहोस्ट के पास इस सटीक उद्देश्य –

6

हाँ आप ऐसा कर सकते हैं - इसे "प्रति-कॉल" अनुरोधों को संभालने के लिए कहा जाता है। एक अनुरोध को संभालने के लिए आने वाले प्रत्येक अनुरोध के लिए ServiceHost आपकी सेवा कक्षा का एक नया उदाहरण तैयार करेगा।

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService : IYourService 
{ 
... 
} 

मार्क

: -

ऐसा करने के लिए, आप "PerCall" होने के लिए अपनी सेवा वर्ग (एक सेवा इंटरफ़ेस को लागू) निर्धारित करने की आवश्यकता है कि आप अपने सेवा वर्ग पर एक विशेषता लगाने से यह कर

+0

यह प्रति कॉल एक नया सेवा उदाहरण बनाएगा, लेकिन प्रति कॉल एक नया थ्रेड नहीं बनाता है। – Nazgul

+0

लेकिन यह अनुरोध को संभालने के लिए एक कार्यकर्ता धागे को नया सेवा उदाहरण असाइन करेगा ...... –

+1

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

3

वास्तव में क्या आप चाहते हैं पर निर्भर करता है, लेकिन निम्न सेवा व्यवहार यह समाधान होगा:

ServiceBehavior: 
ConcurrencyMode=ConcurrencyMode.Multiple 
InstanceContextMode=InstanceContextMode.Single 

आपकी कक्षा एक सिंगलटन होगा, लेकिन तरीकों जाने वाली सभी कॉल एक separ में चलेंगे धागा खा लिया यदि आपको किसी सिंक्रनाइज़ेशन की आवश्यकता है, हालांकि आपको इसे मैन्युअल रूप से करना है।

भी संभावित प्रदर्शन समस्याओं से अवगत होने के लिए थ्रॉटलिंग में देखना न भूलें।

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