Exemple #1
0
        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;
        }