如何在不阻止Windows消息的情况下等待事件?

时间:2011-01-28 07:59:39

标签: c# events outlook wait

这是一个关于在等待事件时保持C#线程处于活动状态的问题。

我正在编写一个C#应用程序,该应用程序将启动一个outlook实例(或者如果有一个活动,则重新使用任何现有实例),创建一个mailitem并显示它,然后等待close事件或发送mailitem事件。

应用程序不会是在outlook内部运行的加载项,而是从outlook外部执行以创建outlook实例和mailitem。

由于我的应用程序不是在outlook的gui中运行,而是启动了outlook的gui,我不知何故需要保持我的进程活着,直到收到事件(发送或关闭)。如果我的应用程序在显示outlook消息后返回并死亡,那么我的事件处理程序也将会死亡。

问题: 如何在等待事件时保持应用程序处于活动状态?

由于我的线程是创建mailitem并在outlook窗口中显示它的线程,我的线程是否负责不阻止可能的消息传递到outlook窗口?

我的想法是有一个看起来像这样的方法,以便在等待时保持进程活着

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

然后让事件处理程序发送和关闭调用另一个方法来唤醒服务员处理事件时

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

这会阻止可能的消息传递到持有我的mailitem的outlook窗口吗?有没有人有更好的解决方案来处理这种情况?

2 个答案:

答案 0 :(得分:4)

您可以使用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为止。这样,您可以使用消息close或send事件的事件处理程序进行一些处理,然后使用{{1}}方法退出应用程序。

答案 1 :(得分:0)

如果您担心阻止调用,可以在单独的线程中启动Outlook实例,然后您的主线程可以在该while循环中使用Thread.Sleep(),这样它就不会经常检查。

我的解决方案并不优雅,但你可能并不太担心会造成很多死锁,所以它应该可以解决。