Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不阻止windows消息的情况下等待事件?_C#_Events_Outlook_Wait - Fatal编程技术网

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

C# 如何在不阻止windows消息的情况下等待事件?,c#,events,outlook,wait,C#,Events,Outlook,Wait,这是一个关于在等待事件时保持C#线程活动的问题 我正在编写一个C#应用程序,它将启动outlook的一个实例(或重新使用任何现有实例,如果有一个实例处于活动状态),创建一个mailitem并显示它,然后等待mailitem的关闭事件或发送事件 应用程序将不是在outlook内部运行的外接程序,而是从outlook外部执行,以创建outlook实例和邮件项 由于我的应用程序不是在outlook的gui中运行,而是在启动outlook的gui,因此我需要在收到事件(发送或关闭)之前保持进程的活动状态

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

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

应用程序将不是在outlook内部运行的外接程序,而是从outlook外部执行,以创建outlook实例和邮件项

由于我的应用程序不是在outlook的gui中运行,而是在启动outlook的gui,因此我需要在收到事件(发送或关闭)之前保持进程的活动状态。如果我的应用程序在显示outlook消息后返回并终止,我的EventHandler也将终止

问题:在等待事件时,我应该如何保持应用程序的活动状态

由于我的线程是创建邮件项目并在outlook窗口中显示它的线程,我的线程是否负责不阻止可能的邮件发送到outlook窗口

我的想法是有这样一种方法,在等待过程中保持流程的活力

while(!MailClosed){
   lock(mailLock){
      Monitor.Wait(mailLock);
   }
}
然后让send和close的事件处理程序在处理完事件后调用另一个方法来唤醒服务员

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

这样做是否会阻止可能的邮件发送到包含我的邮件项目的outlook窗口?有人有更好的解决方案来处理这种情况吗?

如果您担心阻塞调用,可以在单独的线程中启动Outlook实例,然后主线程可以在while循环中执行线程.Sleep(),这样它就不会像以前那样频繁地检查


我的解决方案并不优雅,但您可能不太担心出现大量死锁,因此它应该可以工作。

您可以使用
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
,您可以使用它来代替显示
表单
。这将保持消息循环运行,直到调用
ExitThread
。使用此方法,您可以使用message close或send事件的事件处理程序进行一些处理,然后使用
ExitThread
方法退出应用程序。

您对示例有何疑问。或者问题出在哪里。使应用程序保持活动状态就像不返回并将事件处理程序保留在范围内一样简单。如果我在我的主方法vall mailtime.Display()中打开outlook窗口中的mailtime,我需要阻止主方法返回。为了不返回,我必须将控件保持在循环或som类型的睡眠中。我的问题是——我该怎么做?