2011-01-28 40 views
4

這是一個關於在等待事件時保持C#線程活着的問題。我正在編寫一個C#應用程序,該應用程序將啓動一個Outlook實例(或者如果有一個實例存在,則重新使用任何現有的實例),創建一個mailitem並顯示它,然後等待關閉事件或發送事件的MailItem。如何在不阻止Windows消息的情況下等待事件?

該應用程序不是在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); 
    } 
} 

這樣做會阻止可能的消息被傳遞到Outlook窗口持有我的mailitem?有沒有人有更好的解決方案來處理這種情況?

+0

哈哈,哇,這是舊派! – Pierreten 2011-01-28 08:09:53

回答

0

如果您擔心阻止呼叫,可以在單獨的線程中啓動Outlook實例,然後您的主線程可以在while循環中使用Thread.Sleep(),以便它不會頻繁檢查。

我的解決方案並不優雅,但您可能不太擔心大量的死鎖問題,因此它應該可以工作。

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方法退出應用程序。

相關問題