मैं एक समाचार पत्र प्रणाली है कि मुझे निर्दिष्ट करने के लिए जो सदस्य समाचार पत्र प्राप्त करना चाहिए की अनुमति देता है बनाया है। मैं फिर उन सदस्यों की सूची के माध्यम से लूप करता हूं जो मानदंडों को पूरा करते हैं और प्रत्येक सदस्य के लिए, मैं एक व्यक्तिगत संदेश उत्पन्न करता हूं और उन्हें ईमेल को असंकालिक रूप से भेजता हूं।आंशिक काम किया जा रहा है दो बार (ThreadPool.QueueUserWorkItem)
जब मैं ईमेल भेजने, मैं ThreadPool.QueueUserWorkItem
उपयोग कर रहा हूँ।
किसी कारण के लिए, सदस्यों के एक सबसेट दो बार ईमेल हो रही है। मेरे आखिरी बैच में, मैं केवल 712 सदस्यों को भेज रहा था, फिर भी कुल 7 9 8 संदेश भेजे जा रहे थे।
मैं उन संदेशों को बाहर भेजा प्रवेश करने रहा हूँ और मैं यह बताने के लिए है कि पहले 86 सदस्यों संदेश दो बार प्राप्त कर रहा था। यहाँ लॉग (क्रम में संदेश भेजा गया)
No. Member Date
1. 163992 3/8/2012 12:28:13 PM
2. 163993 3/8/2012 12:28:13 PM
...
85. 164469 3/8/2012 12:28:37 PM
86. 163992 3/8/2012 12:28:44 PM
87. 163993 3/8/2012 12:28:44 PM
...
798. 167691 3/8/2012 12:32:36 PM
प्रत्येक सदस्य एक बार समाचार पत्र प्राप्त करना चाहिए, फिर भी, जैसा कि आप देख सकते हैं सदस्य 163,992 प्राप्त करता है संदेश # 1 और # 86 है, सदस्य 1639 9 3 संदेश मिला # 2 और # 87; और इसी तरह।
नोट करने के लिए दूसरी बात यह संदेश # 85 और # 86 भेजने के बीच एक 7 सेकंड की देरी थी है।
मैंने कई बार कोड की समीक्षा की है और संभवतः ThreadPool.QueueUserWorkItem
को छोड़कर, इसके सभी कारणों के कारण कोड को बहुत अधिक अस्वीकार कर दिया है।
यह पहली बार मैं ThreadPool के साथ काम है, इसलिए मुझे लगता है कि यह से परिचित नहीं हूँ। क्या इस तरह के व्यवहार के कारण कुछ प्रकार की दौड़-स्थिति हो सकती है?
=== --- कोड नमूना --- ===
foreach (var recipient in recipientsToEmail)
{
_emailSender.SendMemberRegistrationActivationReminder(eventArgs.Newsletter, eventArgs.RecipientNotificationInfo, previewEmail: string.Empty);
}
public void SendMemberRegistrationActivationReminder(DomainObjects.Newsletters.Newsletter newsletter, DomainObjects.Members.MemberEmailNotificationInfo recipient, string previewEmail)
{
//Build message here .....
//Send the message
this.SendEmailAsync(fromAddress: _settings.WebmasterEmail,
toAddress: previewEmail.IsEmailFormat()
? previewEmail
: recipientNotificationInfo.Email,
subject: emailSubject,
body: completeMessageBody,
memberId: previewEmail.IsEmailFormat()
? null //if this is a preview message, do not mark it as being sent to this member
: (int?)recipientNotificationInfo.RecipientMemberPhotoInfo.Id,
newsletterId: newsletter.Id,
newsletterTypeId: newsletter.NewsletterTypeId,
utmCampaign: utmCampaign,
languageCode: recipientNotificationInfo.LanguageCode);
}
private void SendEmailAsync(string fromAddress, string toAddress, string subject, MultiPartMessageBody body, int? memberId, string utmCampaign, string languageCode, int? newsletterId = null, DomainObjects.Newsletters.NewsletterTypeEnum? newsletterTypeId = null)
{
var urlHelper = UrlHelper();
var viewOnlineUrlFormat = urlHelper.RouteUrl("UtilityEmailRead", new { msgid = "msgid", hash = "hash" });
ThreadPool.QueueUserWorkItem(state => SendEmail(fromAddress, toAddress, subject, body, memberId, newsletterId, newsletterTypeId, utmCampaign, viewOnlineUrlFormat, languageCode));
}
मुझे दौड़ की स्थिति की तरह लग रहा है - यदि आप कतार का उपयोग करते हैं तो क्या आप ThreadPool.QueueUserWorkItem() को कॉल करने से पहले कतार से आइटम हटाते हैं? क्या हम आपका कोड देख सकते हैं? – alexm
मैं किसी अन्य प्रकार की कतार का उपयोग नहीं कर रहा हूं। असल में: सदस्यों को पूरा करने वाले सदस्यों की सूची के माध्यम से लूप, सदस्य के लिए ईमेल जेनरेट करें, विधि में कॉल जोड़ें जो वास्तव में थ्रेडपूल को ईमेल भेजता है। –
डुप्लिकेट से बचने के लिए उन उपयोगकर्ताओं की सूची बनाए रखें जिनके पास – alexm