private static Task<bool> SendTaskInternal(SmtpClient client, CancellationToken token, object userToken, Action<TaskCompletionSource<bool>> sendAsyncAction) { client.ShouldNotBeNull("client"); sendAsyncAction.ShouldNotBeNull("sendAsyncAction"); if(IsDebugEnabled) log.Debug("SmtpClient를 이용하여 비동기방식으로 메일을 발송합니다... SmtpHost=[{0}]", client.Host); var tcs = new TaskCompletionSource<bool>(userToken); token.Register(client.SendAsyncCancel); SendCompletedEventHandler handler = null; handler = (s, e) => EventAsyncPattern.HandleCompletion(tcs, e, () => (e.Cancelled == false && e.Error != null), () => client.SendCompleted -= handler); client.SendCompleted += handler; try { sendAsyncAction(tcs); } catch(Exception ex) { client.SendCompleted -= handler; tcs.TrySetException(ex); } return tcs.Task; }