2017-01-05 2 views
1

내가 (불행히도) 내가 사용 비동기 적으로 이메일을 보내 시도하고이 프로젝트에서 4SmtpClient.SendAsync는 SmtpClient.Send

를 .NET하는 최대 프레임 워크 허용을 필요로하는 프로젝트를 진행하고 대 전자 우편을 발송하지 SendAsync()하지만 어떤 이유로 든 전송하지 못했습니다 (또는 전송하지 않음). 간단히 말해서 아무 일도 일어나지 않습니다. 오류가 없거나 이상한 점은 이벤트 처리기 코드에 중단 점을 설정하고 프로그램을 단계별로 실행하면 아무 때나 이벤트 처리기로 들어 가지 않는다는 것입니다.

동기화 방법 Send();을 사용하면 완벽하게 작동합니다.

내 코드의 유일한 차이점은 SendAsync(); 메서드에 대한 이벤트 처리기를 사용하는 것입니다. (SendCompleteEventHandler)

아래 코드는 전자 메일을 보내기 위해 시도한 코드입니다.

private static void SendMailAsync() 
{ 

    const string FROM = "[email protected]"; 
    const string TO = "[email protected]"; 

    string SUBJECT = "THIS IS A TEST"; 
    string BODY = "THIS IS A TEST"; 


    const string SMTP_USERNAME = "UserName"; //SMTP username. 
    const string SMTP_PASSWORD = "Password"; // SMTP password. 


    const string HOST = "host.testsmtp.com"; 
    const int PORT = 2587; 

    // Create an SMTP client 
    SmtpClient client = new SmtpClient(HOST, PORT); 
    client.SendCompleted += new SendCompletedEventHandler(Client_SendComplete); 

    // Create a network credential 
    client.Credentials = new System.Net.NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD); 
    client.EnableSsl = true; 

    string userToken = "testmsg1"; 

    // Send the email. 

     client.SendAsync(FROM, TO, SUBJECT, BODY, userToken); 

    client.Dispose(); 

} 

private static void Client_SendComplete(object sender, AsyncCompletedEventArgs e) 
{ 
    string token = (string) e.UserState; 

    if (e.Error != null) 
    { 
     MessageBox.Show(e.Error.ToString()); 
    } 
    else 
    { 
     MessageBox.Show("Message sent."); 
    } 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    SendMailAsync(); 
} 

누락 된 부분이 있습니까? 감사.

+0

동의, 나는 당신이 클라이언트를 처분해야한다고 생각하지 않지만, 당신은 메시지를 처리 ​​할 수 ​​있습니다. 'SendAsync'는 기다릴 수 없으므로 async/await 패턴처럼 보일지라도 그렇게하지 마십시오. – Crowcoder

+0

@Crowcoder - 설명해 주셔서 감사합니다. 매우 기이하다. 그것은 기다릴 수 없다. 이 코드는 [MSDN의 샘플] (https://msdn.microsoft.com/en-us/library/x5x13z6h%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)을 수정 한 것으로 추정됩니다.) –

+0

@KraangPrime, 추측 컨데, 이것이 .net 4.5 이전이라고 생각합니다. 단지 '비동기'라는 이름의 우연한 일치입니다. – Crowcoder

답변

1

asynchronous이라고하는 작업이 백그라운드에서 실행중인 경우 asynchronously입니다. 따라서 SendAsync 메서드를 으로 시작하여 작업을 위해으로 간주해야합니다. 그 후, 실제로 작업을 실행하는 클라이언트를 처리하지 않고 완료 할 때까지 기다리지 않고 다음과 같이 말합니다. 이봐,이 작업을 시작하십시오. 오, 걱정 마세요.

따라서 송신 직후 코드에서 Dispose 메서드를 제거해야합니다. Client_SendComplete (sender 개체는 클라이언트 일 가능성이 높음)에 클라이언트를 배치하거나 클래스에 정적 필드를 만들고 프로그램이 종료 된 후에 처리 할 수 ​​있습니다 (볼 수있는 한 WinForms 프로젝트이므로 일부 Windows 이벤트를 처리 할 수 ​​있습니다.)

관련 문제