Question

Je suis en train d'envoyer des e-mails de manière asynchrone et il fonctionne très bien tant qu'il n'y a pas un AlternateView attaché à l'e-mail. Quand il y a un autre point de vue, je reçois l'erreur suivante:

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)

Voici quelques exemples de code:

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

Et le rappel .....

 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
Était-ce utile?

La solution

La raison pour laquelle cela ne fonctionne pas parce que votre gestionnaire OnCompleted est appelée lorsque la méthode SendAsync () se termine, mais qui semble être avant la SmtpClient a fini d'envoyer physiquement le courrier électronique à travers le réseau (ce qui ne se produira avec le réseau livraison cependant, les livraisons de fichiers sont essentiellement synchrone avec SendAsync ()).

Ce semble presque comme un bug dans le SmtpClient parce OnCompleted devrait vraiment être appelé que lorsque le message a vraiment été envoyé.

Autres conseils

J'ai eu un problème très similaire. Même message d'erreur, mais une structure de code légèrement différent. Dans mon cas, j'éliminait de l'objet MailMessage dans la fonction principale. Au moment où l'événement OnCompleted couru, l'objet était déjà parti.

Regardez votre code après la SendAsync pour voir si vous libérez l'objet MailMessage. Par exemple, si vous créez à l'intérieur d'une instruction à l'aide, il sera libéré avant l'événement async est exécuté.

Vous devez mettre vos DiMS au niveau de la classe si vous voulez y accéder à votre rappel.

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

Je pense que AlternateViews.Add ne fait qu'ajouter une référence de VHA, les besoins de l'objet msg disposent alors que le VHA est disposé automatiquement par le GC ..

Vive

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top