2009-04-22 11 views
1

電子メールを非同期で送信しようとしていますが、電子メールにAlternateViewが添付されていない限り正常に動作します。代替ビューがある場合、私は次のエラーを取得する:.NET SMTP SendAsync with AlternateViewsが例外をスローしました

Dim msg As New System.Net.Mail.MailMessage 
msg.From = New System.Net.Mail.MailAddress("[email protected]", "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 

答えて

2

理由:ここで

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) 

は、いくつかのサンプルコードですSendAsync()メソッドが完了したときにOnCompletedハンドラが呼び出されているが、SmtpClientが物理的にネットワークを介して電子メールを送信する前に表示されるため、これは機能しません(これはファイル配信は基本的にSendAsync()と同期しています)。

OnCompletedは実際にメッセージが送信されたときにのみ呼び出されるべきであるため、これはSmtpClientのバグのようです。

+0

HAV、HAVは、GCによって自動的に配置されているMSGオブジェクトのニーズが処分の参照..

乾杯を追加するということですマイクロソフトに提出してください。それが私をどこにでも連れて来るかどうかがわかります。 – hacker

+0

マイクロソフトは返信し、エラーなく正常に動作させることができたことを示しました。私は電子メールの送信を非同期に再適用し、それをテストするために、そのアプリケーションに戻る機会はありませんでした。 – hacker

0

私は非常に似通った問題がありました。同じエラーメッセージですが、わずかに異なるコード構造です。私の場合、main関数の中にmailmessageオブジェクトを置いていました。 OnCompletedイベントが実行されるまでに、オブジェクトは既に消えていました。

SendAsyncの後にコードを見て、mailmessageオブジェクトを解放しているかどうかを確認します。たとえば、usingステートメント内で作成する場合は、asyncイベントが実行される前に解放されます。

+0

私は最初に、私はMailMessageがfinallyブロックに配置されていることを確認しました。残念ながら、AlternateViewは処分されておらず(今は)、OnCompletedブロックの最後にMailMessageが処分されています。このエラーは、MailMessage dispose呼び出しに到達する前に発生します。私が考えていることの1つは、GCがオブジェクトをあまりにも速く収集しているということです。 – hacker

0

コールバックでアクセスする場合は、クラスレベルに配置する必要があります。

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 

私の推測では、AlternateViews.Addは単に私が送られてきた

関連する問題