2013-04-08 9 views
5

SmtpClient Class बताता है कि इंस्टेंस सदस्य थ्रेड सुरक्षित नहीं हैं। यह देखा जा सकता है कि समवर्ती कॉल Send या SendAsync पर किए गए हैं। यदि पहले अभी तक पूरा नहीं हुआ है तो दोनों विधियां दूसरी कॉल पर एक अमान्य ऑपरेशन अपवाद फेंक देंगी।क्या SmtpClient.SendMailAsync विधियां सुरक्षित हैं?

विधि SendMailAsync, .NET 4.5 में पेश की गई, अमान्यऑपरेशन अपवाद को एक अपवाद के रूप में सूचीबद्ध नहीं करता है। नई .NET 4.5 विधियों को कुछ प्रकार के क्यूइंग लागू करें? परावर्तक इस वर्ग के कार्यान्वयन विवरण पर कोई प्रकाश डालने में सक्षम नहीं है, इसलिए मुझे लगता है कि इसे मूल तरीकों से लागू किया गया है।

एकाधिक थ्रेड्स SMM क्लाइंट के साझा उदाहरण पर SendMessageAsync विधि को सुरक्षित रूप से कॉल कर सकते हैं?

+1

विधि जो थ्रेड-सुरक्षित नहीं हैं, उन्हें अपवाद फेंकने की आवश्यकता नहीं है यदि आप उन्हें एकाधिक धागे से एक्सेस करते हैं। – svick

उत्तर

10

मुझे यकीन नहीं है कि रिफ्लेक्टर का उपयोग क्यों आपके लिए काम नहीं करता है। अगर मैं यह डिकंपाइल, मैं निम्नलिखित कोड देखें:

[HostProtection(SecurityAction.LinkDemand, ExternalThreading=true)] 
public Task SendMailAsync(MailMessage message) 
{ 
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(); 
    SendCompletedEventHandler handler = null; 
    handler = delegate (object sender, AsyncCompletedEventArgs e) { 
     this.HandleCompletion(tcs, e, handler); 
    }; 
    this.SendCompleted += handler; 
    try 
    { 
     this.SendAsync(message, tcs); 
    } 
    catch 
    { 
     this.SendCompleted -= handler; 
     throw; 
    } 
    return tcs.Task; 
} 

आप देख सकते हैं, यह SendAsync() के लिए एक सरल नल आवरण है। और यदि SendAsync() अपवाद फेंकता है, SendMailAsync() बस इसे पुनर्स्थापित करता है।

तो, निष्कर्ष यह है कि SendMailAsync() थ्रेड-सुरक्षित नहीं है और इसके अपवाद दस्तावेज हैं।

+0

मुझे लगता है कि मैं अपने स्वयं के क्यूइंग तंत्र को लागू करने में फंस गया हूं। जवाब के लिए धन्यवाद। – brianfeucht

+0

@brianfeucht आप इसके बजाय 'SmtpClient' के एकाधिक उदाहरणों का उपयोग क्यों नहीं करते हैं (प्रत्येक थ्रेड के लिए एक)? – svick

+0

वह योजना है। SmtpClients का एक पूल बनाएं ताकि मैं नियंत्रित कर सकूं कि मशीन कितने कनेक्शन बनाती है। यदि कोई ग्राहक उपलब्ध है तो इसे साझा किया जाएगा। यदि पूल पूरी तरह से उपयोग किया जाता है तो अनुरोध अगले उपलब्ध ग्राहक के लिए कतारबद्ध किया जाएगा। – brianfeucht

2

एक नोट के रूप में (क्योंकि मेरे पास टिप्पणी करने के लिए पर्याप्त अंक नहीं हैं), एसिंक्रोनस प्रोग्रामिंग मॉडल (एपीएम) का उपयोग करने का पारंपरिक तरीका था, लेकिन आज हम आमतौर पर कार्य-आधारित असीमित पैटर्न का उपयोग करते हैं (टीएपी) इसके async/प्रतीक्षा कीवर्ड के साथ। और हालांकि एपीएम विधियों के आसपास टीएपी रैपर देखने के लिए असामान्य नहीं है, टीएपी विधियों के आस-पास एपीएम रैपर देखना भी संभव है।

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