SmtpClient. SendAsync - Как остановить приложение, выходящее перед обратным вызовом, инициирован?

Используя хорошую структуру данных обычно помогает произвести на преподавателя впечатление:

Нажатие половина символов на стек (Длина / 2).
Pop и сравнивают каждый символ до первого несоответствия.
, Если стек имеет нулевые элементы: палиндром.
*в случае строки с нечетной Длиной, выведите средний символ.

8
задан James 3 November 2015 в 21:08
поделиться

1 ответ

Создайте ManualResetEvent, вызывая WaitOne перед выходом. Когда выполняется последнее электронное письмо / dbupdate, вызовите Set для ManualResetEvent.


public static void Main(string[] args)
{
    object someArrows = ">>>";
    var users = Repository.GetUsers();
    SmtpClient client = new SmtpClient("Host");
    client.SendCompleted += SendCompletedCallback;
    MailAddress from = new MailAddress("system@domain.com", "System", Encoding.UTF8);
    int numRemaining = users.Length;
    using(ManualResetEvent waitHandle = new ManualResetEvent(numRemaining == 0))
    {
        object numRemainingLock = new object();
        foreach(var user in users)
        {
            MailAddress to = new MailAddress(user.Email);
            MailMessage message = new MailMessage(from, to);
            try
            {
                message.Body = "This is a test";
                message.BodyEncoding = System.Text.Encoding.UTF8;
                message.Subject = "test message 1" + someArrows;
                message.SubjectEncoding = System.Text.Encoding.UTF8;
                string userState = String.Format("Message for user id {0}", user.ID);
                client.SendCompleted += delegate
                {
                    lock(numRemainingLock)
                    {
                        if(--numRemaining == 0)
                        {
                            waitHandle.Set();
                        }
                    }
                };
                client.SendAsync(message, userState);
            }
            catch
            {
                message.Dispose();
                throw;
            }
        }
        waitHandle.WaitOne();
    }
}
8
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: