2016-06-14 11 views
7

임씨는 일반적인 질문에 직면 해 있습니다. 나는 그것을 시도해 볼 좋은 모범을 찾을 수 없습니다. Google은 도움이되지 않습니다. 서버가 느리고 메일을받을 수있는 시간이 걸립니다비동기 호출과 함께 using 문 사용 | 작동을 멈출 수 있습니까?

MailMessage mail = new MailMessage(sender, receiver); 
using(SmtpClient client = new SmtpClient()) 
{ 
    client.Host ... 
    client.Port ... 

    mail.subject ... 
    mail.body ... 

    client.SendAsync(mail); 
} 

어떤 경우 :

이 같은 구조를 상상해보십시오. 작업이 완료되기 전에 SmtpClient이 처분 될 수 있습니까? 그것이 어떤 방식 으로든 포기하거나 부러 질 것입니까?

여기에 대한 일반적인 대답이 있습니까? 여기에있는 서버가 너무 빠르지 만 시험판을 수행하는 방법을 모릅니다.


BackgroundWorker는 항상 마무리 현재 작업을 취소에 대해 생각합니다. ... 여기에 동일하거나 어쩌면이 될 수

+2

가 예, ***는 ***은'client' 처분 할이 코드 이메일이 전송되기 전에. 이것은 아마 나쁘다. – spender

답변

12

당신은 Task을 반환하는 새로운 SendMailAsync 방법을 사용하고, 해당 작업을 기다리고 있습니다 :

MailMessage mail = new MailMessage(sender, receiver); 
using(SmtpClient client = new SmtpClient()) 
{ 
    client.Host ... 
    client.Port ... 

    mail.subject ... 
    mail.body ... 

    await client.SendMailAsync(mail); 
} 

이 클라이언트가 아닌지 확인됩니다 SendMailAsync 완료 전에 처리.

는 (물론이 이제 방법을 의미뿐만 아니라 비동기이어야한다)

+0

마지막 문장에 따르면'await'이 내 스레드를 차단합니다. 맞습니까? – C4u

+3

@ C4u no,'await'은 스레드를 풀어서 비동기 연산이 완료 될 때까지 기다렸다가 실행을 다시 시작합니다. –

+0

@ AvnerShahar-Kashtan 아 와우. 그런 다음 내가 원하는 모든 것을 얻었습니다. 둘 다 큰 감사 :). – C4u