2012-10-19 23 views
5

पर एकाधिक सेवाओं को शुरू करना मैं थ्रेड (पृष्ठभूमि में) पर प्रॉक्सी खोलने की कोशिश कर रहा हूं, थ्रेड प्रॉक्सी का एक नया उदाहरण बनाता है, सेवा की विधि को कॉल करता है और सेवा का निपटान करने के तुरंत बाद।धागे

यह सब एक धागे पर होता है:

var background = new Thread(() => 
{ 
    var proxy = new AssignmentSvcProxy(new EndpointAddress(worker.Address));    

    try 
    { 
     proxy.Channel.StartWork(workload); 
     proxy.Dispose();     
    } 
    catch (EndpointNotFoundException ex) 
    { 
     logService.Error(ex);       
     proxy.Dispose(); 
     proxy = null; 
    } 
    catch (CommunicationException ex) 
    { 
     logService.Error(ex); 
     proxy.Dispose(); 
     proxy = null; 
    } 
    catch (TimeoutException ex) 
    { 
     logService.Error(ex);      
     proxy.Dispose(); 
     proxy = null; 
    } 
    catch (Exception ex) 
    { 
     logService.Error(ex);      
     proxy.Dispose(); 
     proxy = null; 
    }     

}) { IsBackground = true }; 

background.Start(); 

मैं भले ही मैं CloseTimeout, OpenTimeout, ReceiveTimeout, SendTimeout के लिए अधिकतम करने के लिए समय समाप्ति की स्थापना की है हो रहा रुक-रुक कर टाइमआउट मुद्दों दिखाई दे रहा है।

मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि यह डिज़ाइन के अनुसार यह कोई मुद्दा नहीं है यानी धागे पर एक सेवा खोलना और इसे निपटाना?

संपादित करें:

प्रॉक्सी आंतरिक रूप से कस्टम प्रत्येक थ्रेड के लिए अलग अंतिमबिंदुओं पर बाध्यकारी साथ एक चैनल स्थापित करता है।

+0

यह है कि आप "सेवा" की बात करते हैं, जहां मैं उम्मीद थी "प्रॉक्सी" थोड़ा भ्रामक है, उदाहरण के लिए "थ्रेड सेवा खोलता है" होना चाहिए "धागा मेरी सेवा के लिए प्रॉक्सी खोलता है", है ना? – Jeroen

+0

क्षमा करें, मैंने अभी प्रश्न को अपडेट किया है, इसलिए मूल रूप से मेरी सेवा पहले से ही खुली है लेकिन हाँ प्रॉक्सी सिर्फ प्रॉक्सी को कॉल करती है। चैनल.स्टार्टवर्क (वर्कलोड); उस विशेष सेवा (जो पहले से ही स्वयं होस्ट किया गया है) - समझ में आता है? –

+0

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

उत्तर

6

मुझे लगता है कि समस्या यह हो सकती है कि आप प्रॉक्सी को सही ढंग से बंद नहीं कर रहे हैं। यदि आपके पास सर्वर पर क्लिक करने वाले बहुत से थ्रेड हैं और वे सभी स्वयं के बाद सफाई नहीं कर रहे हैं, तो आप उन कनेक्शनों पर कुछ टाइमआउट प्राप्त कर सकते हैं।

निपटान कनेक्शन बंद करने के लिए आदर्श नहीं है। यहाँ अधिक जानकारी:

try 
{ 
    proxy.Close(); 
} 
catch (Exception ex) 
{ 
    proxy.Abort(); 
} 
finally 
{ 
    proxy = null; 
} 

आप कनेक्शन बंद करने का प्रयास है, अगर यह विफल रहता है, आप सभी कनेक्शनों को निरस्त: Disposing proxies

आदर्श पैटर्न का उपयोग करने के लिए इस प्रकार है। अपवाद होने पर निपटान रद्द नहीं होता है।

इस तरह के रूप में, मैं तो जैसे refactor होगा: (या यहाँ तक कि "ग्राहक")

var background = new Thread(() => 
{ 
    var proxy = new AssignmentSvcProxy(new EndpointAddress(worker.Address));    

    try 
    { 
     proxy.Channel.StartWork(workload); 
    } 
    catch (Exception ex) 
    { 
     // You aren't doing anything special with your specific exception types 
     logService.Error(ex);      
    }     
    finally 
    { 
     try 
     { 
      proxy.Close(); 
     } 
     catch (Exception ex) 
     { 
      proxy.Abort(); 
     } 
     finally 
     { 
      proxy = null; 
     } 
    } 

}) { IsBackground = true }; 

background.Start(); 
+1

यह काम करता है। हालांकि, डब्ल्यूसीएफ प्रॉक्सी थ्रेड सुरक्षित हैं (समवर्ती कॉल धारावाहिक हैं)। प्रॉक्सी बनाने और सर्वर से नया कनेक्शन खोलने के बाद से एक महंगा ऑपरेशन होता है, आमतौर पर प्रॉक्सी को थ्रेड में पुन: उपयोग किया जाता है। –

+0

मैं सहमत हूं, यही कारण है कि यदि कनेक्शन किसी भी कारण से विफल रहता है तो उसे आदर्श रूप से एक पुनः प्रयास तंत्र होना चाहिए। विफलता प्रबंधन में यह पैटर्न तब सुनिश्चित करेगा कि नया कनेक्शन बनाने के लिए मजबूर होने से पहले पुराना कनेक्शन साफ ​​हो जाए। – Bardia