سؤال

أحاول إرسال رسائل البريد الإلكتروني بشكل غير متزامن ويعمل بشكل جيد طالما لم يكن هناك إلقاء نظرة فارقة على البريد الإلكتروني. عندما يكون هناك طريقة عرض بديلة، أحصل على الخطأ التالي:

Cannot access a disposed object. Object name: 'System.Net.Mail.AlternateView'
System.Net.Mail.SmtpException: Failure sending mail. ---> System.ObjectDisposedException: Cannot access a disposed object.

Object name: 'System.Net.Mail.AlternateView'.
   at System.Net.Mail.AlternateView.get_LinkedResources()
   at System.Net.Mail.MailMessage.SetContent()
   at System.Net.Mail.MailMessage.BeginSend(BaseWriter writer, Boolean sendEnvelope, AsyncCallback callback, Object state)
   at System.Net.Mail.SmtpClient.SendMailCallback(IAsyncResult result)

إليك بعض نماذج الشفرة:

Dim msg As New System.Net.Mail.MailMessage
msg.From = New System.Net.Mail.MailAddress("me@example.com", "My Name")
msg.Subject = "email subject goes here"

'add the message bodies to the mail message
Dim hAV As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(textBody.ToString, Nothing, "text/plain")
hAV.TransferEncoding = Net.Mime.TransferEncoding.QuotedPrintable
msg.AlternateViews.Add(hAV)

Dim tAV As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(htmlBody.ToString, Nothing, "text/html")
tAV.TransferEncoding = Net.Mime.TransferEncoding.QuotedPrintable
msg.AlternateViews.Add(tAV)

Dim userState As Object = msg
Dim smtp As New System.Net.Mail.SmtpClient("emailServer")

'wire up the event for when the Async send is completed
 AddHandler smtp.SendCompleted, AddressOf SmtpClient_OnCompleted

 Try
     smtp.SendAsync(msg, userState)
 Catch '.... perform exception handling, etc...
 End Try

والبدل .....

 Public Sub SmtpClient_OnCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    If e.Cancelled Then
      'Log the cancelled error
    End If
    If Not IsNothing(e.Error) Then
        'Log a real error....
        ' this is where the error is getting picked up
    End If

    'dispose the message
    Dim msg As System.Net.Mail.MailMessage = DirectCast(e.UserState, System.Net.Mail.MailMessage)
    msg.Dispose()

End Sub
هل كانت مفيدة؟

المحلول

والسبب في أن هذا لا يعمل لأنه يتم استدعاء معالجك المشترك عند اكتمال طريقة SendAsync ()، ولكن يبدو أنه قبل أن تنتهي SMTPClient إرسال البريد الإلكتروني جسديا عبر الشبكة (سيكون هذا يحدث فقط مع تسليم الشبكة، تسليم الملفات متزامن بشكل أساسي مع SendAsync ()).

يبدو أن هذا تقريبا مثل خطأ في SMTPClient لأنه يجب أن يتم استدعاء OnCompleted إلا عند إرسال الرسالة حقا.

نصائح أخرى

كان لدي قضية تباطؤ للغاية. نفس رسالة الخطأ، ولكن بنية شفرة مختلفة قليلا. في حالتي، كنت أتخلص من كائن MailMessage داخل الوظيفة الرئيسية. بحلول الوقت الذي ران حدث oncompleted، كان الكائن قد ذهب بالفعل.

انظر إلى التعليمات البرمجية الخاصة بك بعد SENDASYNC لمعرفة ما إذا كنت تحرر كائن MailMessage. على سبيل المثال، إذا كنت تقوم بإنشاء ذلك داخل عبارة باستخدام، فسيتم تحريرها قبل تشغيل حدث ASYNC.

يجب عليك وضع Dims الخاص بك على مستوى الفصل إذا كنت ترغب في الوصول إليها في رد الاتصال الخاص بك.

private msg As System.Net.Mail.MailMessage
private hAV As System.Net.Mail.AlternateView 

private sub yoursub
  msg = new System.Net.Mail.MailMessage(..
  hAV = new ...
end sub

تخميني هو أن AlternateViewsviews.add يضيف مجرد إشارة إلى HAV، ويحتاج كائن MSG، حيث يتم التخلص من HAV تلقائيا من قبل GC ..

هتافات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top