2010-09-03 95 views
2

我正在創建一個Outlook郵件項目對象並監視發送事件。所有顯示都很好,但是當Send事件觸發時,事件在我的應用程序的後臺線程中引發。這是一個問題,原因是此事件創建了通過我的應用程序發送的電子郵件記錄,該電子郵件被添加到對象集合中。因此,該集合引發後臺線程上的List Changed事件,從而在顯示該集合的控件上導致跨線程控制訪問。在後臺線程上引發的Outlook電子郵件發送事件

這裏是我的事件聯播:

((Outlook.ItemEvents_10_Event)item).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(ItemSendWatcher_Send); 

該事件在保持該消息的引用的基本類迷上了發送,並委託時提出的發送事件來調用。這允許我將電子郵件對象的實例傳遞給委託。

這是我的處理程序:

void ItemSendWatcher_Send(ref bool Cancel) 
    { 
     if (itemSendDelegate != null) 
     { 
      this.itemSendDelegate(this.item, ref Cancel); //The delegate with the mail item 
     } 
     Marshal.ReleaseComObject(item); 
     itemSendDelegate = null; 
    } 

這是該事件的正確的行爲還是我構造對象時做錯了什麼?謝謝你的幫助。

編輯:只是爲了澄清,我沒有處理UI層中的事件,而是處理業務對象。從發送事件處理程序調用的委託會導致在內部將新對象添加到列表中,這會導致列表的ListChanged事件被引發,導致在顯示此列表的控件中調用處理程序。我希望這能澄清我試圖達到的目標。

+1

你能展示更多的代碼嗎? – 2010-09-03 11:36:18

+0

現在稍微更清晰,這是一個已知的問題:http://stackoverflow.com/questions/2354438/mvvm-best-practice-to-pass-dispatcher-to-the-viewmodel – 2010-09-03 13:05:45

回答

1

很多形式事件在主窗口線程,這意味着你往往不必過分擔心橫紗的擔憂上提出的。但是沒有保證,COM通常不會在該線程上引發事件。解決方案是調用this.Invoke(..)與委託給方法或匿名塊來執行必要的工作在正確的線程。測試這是否有必要測試this.InvokeRequired。

+0

Invoke和InvokeRequired不可用,因爲該類不是控件。這就是爲什麼我在之前的回答中評論如果我需要創建控件的實例以允許我調用Invoke。 – GaryJL 2010-09-03 12:33:03

+0

無論您在處理程序中更改什麼內容(即顯示列表的控件),都需要使用Invoke。 – 2010-09-03 12:38:15

+0

我明白了 - 這很有道理!問題在於,在處理事件期間的任何階段,我都無法訪問控件,除非列表更改事件在我的集合類中引發。時間來重構我想! – GaryJL 2010-09-03 12:46:18

1

您需要處理InvokeRequired +調用內部ItemEvents_10_SendEventHandler()

+0

我假設你的意思是創建一個實例控制在這將允許我調用處理程序使用control.Invoke? – GaryJL 2010-09-03 12:01:33

+0

不,請查看如何使用Control.Invoke和InvokeRequired。創建控件沒有什麼特別的。發佈事件處理程序的代碼以獲得更好的答案。 – 2010-09-03 12:17:04

+0

事件處理程序的代碼存在於問題中。 – GaryJL 2010-09-03 12:21:41

相關問題