2014-07-16 2 views
2

메일을 보내려고하지만 작업이 취소됩니다. 왜 그런가? 사전에 어떤 도움SMTP 보내기 메일 취소

using(SmtpClient smtpClient = new SmtpClient()) 
{ 
    return smtpClient.SendAsync(msg); 
} 

감사 :

public static Task SendAsync(this SmtpClient client, MailMessage message) 
{ 
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(); 
    Guid sendGuid = Guid.NewGuid(); 

    SendCompletedEventHandler handler = null; 
    handler = (o, ea) => 
    { 
     if (ea.UserState is Guid && ((Guid)ea.UserState) == sendGuid) 
     { 
      client.SendCompleted -= handler; 
      if (ea.Cancelled) 
      { 
       tcs.SetCanceled(); // TASK CANCELLED: Why? 
      } 
      else if (ea.Error != null) 
      { 
       tcs.SetException(ea.Error); 
      } 
      else 
      { 
       tcs.SetResult(null); 
      } 
     } 
    }; 

    client.SendCompleted += handler; 
    client.SendAsync(message, sendGuid); 
    return tcs.Task; 
} 

에 의해 호출! Gerard

+0

당신이 코드를 디버깅 시도? –

+0

네,하지만 아직 단서가 없습니다. 그것은 몇몇 우편물을 위해 잘 일하고, 그러나 오늘부터 우편물은 취소된다. – Gerard

+0

문제는 Using 문으로 인해 발생합니다. 작업을 완료하기 전에 smtp-client가 범위를 벗어난 것 같아서 작업을 취소하는 것처럼 보입니다. Using 문을 사용하지 않으면 코드가 제대로 실행됩니다. – Gerard

답변

4

using 구문은 실행 블록을 완료 할 때 객체 Dispose 메서드를 호출합니다. 비동기 방식에 await를 사용하지 않고 smtpClient.SendAsync를 호출하면 실행 블록이 종료 될 것입니다 Dispose일부 메일이 일부 개체를 버리기 전에 완료 할 수 있으므로 완료 이유를 설명하는, 심지어 SendAsync 방법은 여전히 ​​실행되지만, SmtpClient에 전화를 할 것입니다 다른 사람들은 그렇지 않습니다.

는이 작업을 수행 :

using (SmtpClient smtpClient = new SmtpClient()) 
{ 
    await smtpClient.SendAsync(msg); 
} 
+0

고마워, 발견 (위의 주석 참조). 기다리지 않으려면 어떡하지? Will SmtpClient smtpClient = 새로운 SmtpClient(); 그 다음에 smtpClient.SendAsync (msg); 작업? 그것은 작동하는 것 또는 운이 좋은가 (smtpClient는 아직 처리되지 않음). – Gerard

+0

사용하는 문장이 끝나기 전에 끝내기 만하면됩니다. 'using '없이 직접 sntp를 처리 할 수 ​​있습니다. –

+0

'SendAsync'가 아닌'SendMailAsync'를 의미한다고 생각합니다. – ChrisW

관련 문제