2012-02-08 6 views
12

मैं SMTPClient.Send(mail) विधि अपने आवेदन प्रतीक्षा करता है उपयोग कर रहा था ईमेल भेजने के लिए, लेकिन फिर मैंने देखा कि, अगर ईमेल आईडी मौजूद नहीं है (मौजूद नहीं करता है), जब तक यह अपवाद प्राप्त करता है और उसके बाद उपयोगकर्ता आगे कार्य करने के लिए अनुमति देता है।मैं SmtpClient.SendAsync के उपयोगकर्ता टोकन ऑब्जेक्ट से क्या लाभ ले सकता हूं?

तो मैं SMTPClient.SendAsync विधि का उपयोग कर के बारे में सोचा।

मेरा संदेह !! इस उपयोगकर्ता टोकन ऑब्जेक्ट का उपयोग कहां किया जा सकता है जिसे विधि के पैरामीटर के रूप में पास किया जाता है? मैंने ऑनलाइन कई चीजों की खोज की लेकिन मुझे एक अच्छा उदाहरण नहीं मिला। यहां तक ​​कि MSDN में वे इस

string userState = "test message1"; 
client.SendAsync(message, userState); 

की तरह उपयोग लेकिन तब क्या यह वास्तव में के लिए इस्तेमाल किया जा सकता है?

अग्रिम धन्यवाद।

+0

मैंने एक सरलीकृत मामले के नीचे वर्णित किया है जिसे मैंने अपनी पिछली परियोजनाओं में से एक में उपयोग किया था। –

उत्तर

20

आप नीचे दिए गए मामले में इसका इस्तेमाल हो सकता है: कल्पना करें कि आप बैच ईमेल भेजने के लिए आवेदन किया है। आप संदेश प्राप्त करते हैं (प्रत्येक प्राप्तकर्ता के लिए अलग-अलग संदेश \ अनुलग्नक, ताकि आप इसे एक संदेश में गठबंधन नहीं कर सकें), उदाहरण के लिए 20 प्राप्तकर्ताओं का चयन करें और "सभी भेजें" बटन दबाएं। भेजने के लिए आपको "पूल" से SendAsync और कई SmtpClient उदाहरणों का उपयोग करने के लिए (जैसा कि SmtpClient पिछले कॉल को पूरा नहीं होने से पहले एक उदाहरण पर दो बार SendAsync को कॉल करने की अनुमति नहीं देता है)।

आप एक ही SmtpClientSendCompleted सभी SendAsync कॉल जिसमें आप उन्नत लॉगिंग प्रदर्शन करना चाहिए के लिए हैंडलर है: प्रवेश करते है, भेजने के नाम में विफल रहा संदेशों के प्राप्तकर्ताओं की (पते या यहाँ तक कि संलग्नक), लेकिन AsyncCompletedEventArgs का परिणाम उपयोगकर्ता जानकारी की सहायता से ही यह जानकारी प्रदान कर सकते हैं। इसलिए इस उद्देश्य के लिए मूल पैटर्न कस्टम उपयोगकर्ता स्थिति ऑब्जेक्ट का उपयोग करना है।

इंटरफ़ेस जो खेतों आप हैंडलर में की आवश्यकता होगी शामिल हैं:: तो सरलीकृत उदाहरण देख

public interface IEmailMessageInfo{ 
    string RecipientName {get;set;} 
} 

Async राज्य वर्ग:

/// <summary> 
/// User defined async state for SendEmailAsync method 
/// </summary> 
public class SendAsyncState { 

    /// <summary> 
    /// Contains all info that you need while handling message result 
    /// </summary> 
    public IEmailMessageInfo EmailMessageInfo { get; private set; } 


    public SendAsyncState(IEmailMessageInfo emailMessageInfo) { 
     EmailMessageInfo = emailMessageInfo; 
    } 
} 

यहाँ ई-मेल भेजने के लिए कोड:

SmtpClient smtpClient = GetSmtpClient(smtpServerAddress); 
smtpClient.SendCompleted += SmtpClientSendCompleted; 
smtpClient.SendAsync(
    GetMailMessage() 
    new SendAsyncState(new EmailMessageInfo{RecipientName = "Blah-blah"}) 
); 

और हैंडलर कोड उदाहरण:

private void SmtpClientSendCompleted(object sender, AsyncCompletedEventArgs e){ 
    var smtpClient = (SmtpClient) sender; 
    var userAsyncState = (SendAsyncState) e.UserState; 
    smtpClient.SendCompleted -= SmtpClientSendCompleted; 

    if(e.Error != null) { 
     tracer.ErrorEx(
      e.Error, 
      string.Format("Message sending for \"{0}\" failed.",userAsyncState.EmailMessageInfo.RecipientName) 
     ); 
    } 

    // Cleaning up resources 
    ..... 
} 

कृपया, अगर आप अधिक जानकारी की आवश्यकता मुझे पता है।

1

आप async उपयोग कर रहे हैं(), आप भी ईवेंट हैंडलर की आवश्यकता है।

static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
    { 
     //to be implemented   
    } 

Async() विधि का उपयोग करके ईमेल भेजने के लिए यह ठीक है। उम्मीद है कि यह सहायक है।

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

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