Асинхронная операция была отменена

288
22 января 2018, 05:20

Пытаюсь отправить письмо на электронную почту (код взят из документации Microsoft), но операция отменяется и сообщение на почту не приходит. Помогите решить проблему.

static bool mailSent = false;
    private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
        String token = (string)e.UserState;
        if (e.Cancelled)
        {
            Console.WriteLine("[{0}] Send canceled.", token);
        }
        if (e.Error != null)
        {
            Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
        }
        else
        {
            Console.WriteLine("Message sent.");
        }
        mailSent = true;
    }

    public static void SendMessage()
    {           
        SmtpClient client = new SmtpClient();
        client.Host = "smtp.gmail.com";
        client.Port = 465;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential(mailFrom, password);
        MailAddress from = new MailAddress(mailFrom,"saturn",System.Text.Encoding.UTF8);
        MailAddress to = new MailAddress(mailTo);
        MailMessage message = new MailMessage(from, to);
        message.Body = "This is a test e-mail message sent by an application. ";
        message.BodyEncoding = System.Text.Encoding.UTF8;
        message.Subject = "test message 1";
        message.SubjectEncoding = System.Text.Encoding.UTF8;
        client.SendCompleted += new
        SendCompletedEventHandler(SendCompletedCallback);
        string userState = "test message1";
        client.SendAsync(message, userState);            
        if (mailSent == false)
        {
            client.SendAsyncCancel();
        }
        message.Dispose();
    }

Answer 1

Вы, конечно, взяли код у Microsoft-а, но выкинули ключевую строчку между client.SendAsync и проверкой:

string answer = Console.ReadLine();

И, соответственно, упростили проверку. Но код-то, вызвав client.SendAsync, ничего не ждет, а продолжает идти дальше и попадает в Ваш if, так как к этому моменту обработчик SendCompletedCallback еще не выполнился.

await client.SendMailAsync(message);
Answer 2

Можно сделать синхронный вызов

client.Send(message, userState);  

Или сделать асинхронно

await client.SendAsync(message, userState);  

При этом незабываем добавить async в определение функции

public static async void SendMessage()
READ ALSO
NLog в C#. Для чего он?

NLog в C#. Для чего он?

Что такое NLog? Для чего он? Если можно приведите какие-то примеры

368
Изучение С# по книгам

Изучение С# по книгам

Я хочу выучить язык С# но должен ли я читать книги которые по С# 60(моя версия С# в которой я и хочу кодить ) или же могу прочитать C# 4

298
request.form is null

request.form is null

Создаю веб сервер на который будут отправляться post запросы от других серверов, создал контроллер

295