2010-06-01 15 views
6

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

धन्यवाद!

+0

आप सेवा की मेजबानी कैसे कर रहे हैं? क्या यह कुछ एक्सई का उपयोग कर एक खिड़की सेवा या एक कस्टम होस्टिंग है? – Kangkan

+0

WinForms निष्पादन योग्य मेजबान डब्ल्यूसीएफ सेवा पुस्तकालय। – SharpAffair

उत्तर

1

"उसी विंडोज़ फॉर्म एप्लिकेशन से यदि आप यूआई थ्रेड शुरू करने से पहले सर्विसहोस्ट इंस्टेंस का निर्माण करना चाहते थे, तो यह अपने धागे पर चला जाएगा। इसका मतलब है कि संदेश लूप के बजाय थ्रेड पूल प्रक्रिया संदेशों से आवंटित कार्यकर्ता थ्रेड। इस प्रकार, सेवाएं वास्तव में एकाधिक समवर्ती अनुरोधों को संसाधित कर सकती हैं। "

+1

इसके परिणामस्वरूप मैंने नीचे दिए गए उत्तर के बराबर कार्यक्षमता का परिणाम दिया होगा। चूंकि आप SycnhronizationContext.Current प्रॉपर्टी से पहले सर्विसहोस्ट बना रहे हैं, WindowsFormsSynchronizationContext (उदाहरण के लिए किसी भी नियंत्रण से पहले) के उदाहरण पर सेट हो जाता है, तो आपका ServiceHost UI थ्रेड पर सेवा अनुरोधों को संसाधित करने का प्रयास नहीं करेगा। मेरे समाधान का लाभ यह है कि यह इस व्यवहार को नीति का मामला बनाता है, जिससे इससे कोई फर्क नहीं पड़ता कि आप अपना सर्विसहोस्ट बनाने का निर्णय लेते हैं। – luksan

0

आपको यूआई प्रोग्राम के अंदर डब्ल्यूसीएफ सेवा होस्ट नहीं करना चाहिए। डब्ल्यूसीएफ में एक बहुत ही विशिष्ट थ्रेडिंग मॉडल है, जो आपके यूआई को अच्छी तरह से चलने से रोक देगा।

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

मैं इस परिस्थितियों में क्या करता हूं, Windows Service hosting WCF बनाना है, और निगरानी डेटा को आवश्यक डेटा का पर्दाफाश करने के लिए एक सेवा नियंत्रण बनाएं। यह यूआई सेवा के दूसरे ग्राहक होने के नाते स्वतंत्र रूप से अपने स्वयं के एक्सई में चलाएगा, जो आवश्यकतानुसार सेवा से डेटा लाएगा।

मुझे उम्मीद है कि आपके लिए समझदारी होगी।

11

आपको अपनी सेवा को लागू करने वाले वर्ग में ServiceBehaviorAtttribute जोड़ना चाहिए और UseSynchronizationContext संपत्ति को झूठी में सेट करना चाहिए। इससे आपकी सेवा को अपने स्वयं के धागे पर संसाधित किया जाएगा।

उदाहरण:

[ServiceBehavior(UseSynchronizationContext=false)] 
class YourService : IYourService 
{ 
    // Service Methods 
} 

बस इतना ध्यान रखें कि अगर आप अपने सेवा तरीकों के भीतर से किसी भी नियंत्रण को अद्यतन करने के लिए जा रहे हैं, तो आप मन cross-thread programming model of Windows Forms में वहन करना होगा।

+0

वाह + 1 उस सुविधा को नहीं जानता था! –

+0

यह मेरी 2 ~ दिनों की बग सर्च का समाधान है, क्यों एक डब्ल्यूसीएफ सेवा गैर-यूआई ऐप पर काम नहीं करती है (ऐप में यूआई और गैर यूआई मोड दोनों हैं)। धन्यवाद। –