Как ждать события, не блокируя сообщения Windows? - PullRequest
4 голосов
/ 28 января 2011

Это вопрос о поддержании потока C # во время ожидания событий.

Я пишу приложение на C #, которое должно запустить экземпляр outlook (или повторно использовать любой существующий экземпляр, если есть один активный), создать mailitem и показать его, а затем ждать события close или send для mailitem ,

Приложение не будет надстройкой, работающей внутри outlook, но будет выполнено извне outlook для создания экземпляра outlook и mailitem.

Поскольку мое приложение не запускается из графического интерфейса Outlook, а скорее запускает графический интерфейс Outlook, мне каким-то образом необходимо поддерживать процесс в рабочем состоянии до тех пор, пока не будут получены события (отправка или закрытие). Если мое приложение вернется и умрет после отображения сообщения Outlook, мои обработчики событий также будут мертвыми.

Вопрос: Как мне поддерживать приложение в ожидании событий?

Поскольку мой поток является тем, который создает почтовый элемент и показывает его в окне Outlook, отвечает ли мой поток за то, чтобы не блокировать доставку возможных сообщений в окно Outlook?

Я думал о том, чтобы подобный метод поддерживал процесс во время ожидания

while(!MailClosed){
   lock(mailLock){
      Monitor.Wait(mailLock);
   }
}

и затем позволяют обработчикам событий для отправки и закрытия вызывать другой метод, чтобы разбудить официанта, когда они закончат обработку события

private void SignalClose(){
   lock(mailLock){
      MailClosed = true;
      Monitor.Pulse(mailLock);
   }
}

Будет ли блокирование возможных сообщений от доставки в окно Outlook, содержащее мой почтовый элемент? У кого-нибудь есть лучшее решение для решения этой ситуации?

Ответы [ 2 ]

4 голосов
/ 28 января 2011

Вы можете использовать ApplicationContext для поддержания цикла сообщений.

Я не уверен, что вы ищете приведенный ниже пример, но я будупопробуйте.

static class Program
{
    private static ApplicationContext _context;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        using (_context = new ApplicationContext())
        {
            var message = new OutlookMailMessage();

            message.Closed += new EventHandler(message_Closed);

            Application.Run(_context);
        }
    }

    static void message_Closed(object sender, EventArgs e)
    {
        // Perform processing after the message has been send or closed.

        _context.ExitThread();
    }
}

Приведенный выше код начинается с ApplicationContext, который можно использовать вместо отображения Form.Это поддерживает цикл обработки сообщений до тех пор, пока не будет вызван ExitThread.При этом вы можете использовать обработчик события закрытия или отправки сообщения, чтобы выполнить некоторую обработку, а затем выйти из приложения, используя метод ExitThread.

0 голосов
/ 28 января 2011

Если вы беспокоитесь о блокировке вызовов, вы можете запустить экземпляр Outlook в отдельном потоке, тогда ваш основной поток может выполнять Thread.Sleep () в цикле while, чтобы он не проверялся так часто.

Мое решение не элегантное, но вы, вероятно, не слишком беспокоитесь о множественной блокировке, поэтому оно должно работать.

...