2014-05-22 2 views
2

전자 메일을 보내면 작업을 시작하는 Outlook 추가 기능을 작성했습니다. 이 작업은 전자 메일을 작성하는 동안 플래그가 설정된 경우에만 발생해야합니다. 플래그는 토글 버튼을 클릭하여 설정됩니다. 전자 메일이 전송되면 이벤트가 시작되고 전자 메일의 ID를 대기열에 저장합니다. 메일이 보낸 폴더에 나타나면 이벤트가 발생해야하고 동일한 ID가 대기열에 있으면 작업이 수행되어야합니다.Outlook 항목 추가 이벤트가 트리거되지 않았습니다.

아래에는 두 가지 방법이 있습니다. Application_ItemSend는 전자 메일이 전송 될 때 발생하고 EnQueue가 SentItemsQueue에서 호출되는 메서드에서 발생합니다. EnQueue 메서드는 보낸 편지함 폴더에 이벤트를 첨부하고 항목이 추가되면 작업을 시작하는 이벤트를 발생시킵니다.

전자 메일을 작성하고 Outlook에서 보낼 때이 모든 작업이 정상적으로 작동합니다. Word와 같은 외부 프로그램에서 전자 메일을 시작하면 Application_ItemSend가 실행되지만 EMailFoundInSentItems (EnQueue에 연결됨)는 실행되지 않습니다. 이벤트가 실행되지 않는 이유는 무엇입니까?

public partial class ThisAddIn {  

    void Application_ItemSend(object item, ref bool cancel) 
    { 
     try 
     { 
     Trace.TraceInformation("E-mail is being sent. Checking for archive flag."); 
     MailItem mail = item as MailItem; 
     bool? archive = mail.GetArchiveFlag(); 

     if (archive == true) 
     { 
      Trace.TraceInformation("Archive flag was set, going to queue e-mail for archiving."); 
      this.SentItemsQueue.EnQueue(mail); 
     } 

     Marshal.ReleaseComObject(mail); 
     } 
     catch (System.Exception ex) 
     { 
     Trace.TraceError("An exception was thrown while trying to archive a sent mail item. Exception: {0}.", ex.ToString()); 
     } 
    } 
... 

public class SentItemsArchiveQueue 
{ 
    public void EnQueue(MailItem mail) 
    { 
     // remove and re-add handler (remove first, so it's not registered twice) 
     mail.SaveSentMessageFolder.Items.ItemAdd -= new ItemsEvents_ItemAddEventHandler(EMailFoundInSentItems); 
     mail.SaveSentMessageFolder.Items.ItemAdd += new ItemsEvents_ItemAddEventHandler(EMailFoundInSentItems); 

     this.Queue.Add(mail.ConversationIndex); 
     Trace.TraceInformation("Queue ConversationIndex is {0}", mail.ConversationIndex); 
    } 
... 

답변

5

이벤트를 발생시키는 개체 (항목 컬렉션)는 이벤트를 발생 시키려면 활성 상태로 유지되어야합니다. 여러 점 표기법을 사용하고 즉시 컴파일러에 의해 생성 된 암시 적 변수가 범위를 벗어나 수집 쓰레기를수록, 어떤 이벤트가 발생되지 않습니다 :

public class SentItemsArchiveQueue 
{ 
    Items _items; 

    public void EnQueue(MailItem mail) 
    { 
     _items = mail.SaveSentMessageFolder.Items; 
     _items.ItemAdd += new ItemsEvents_ItemAddEventHandler(EMailFoundInSentItems); 

     this.Queue.Add(mail.ConversationIndex); 
     Trace.TraceInformation("Queue ConversationIndex is {0}", mail.ConversationIndex); 
    } 
+1

감사합니다. Items 변수를 ThisAddIn.cs 파일로 이동하여 범위를 벗어나지 않도록했습니다. 문제 해결됨. –

관련 문제