2016-09-23 95 views
0

嘿,夥計們我是辦公室外掛程序的新手,現在我正在爲Outlook創建插件。這個outlook插件的目的是獲取每個帳戶收件箱中的所有傳入郵件並將它們發送到我的服務器。 我已經用Microsoft.Office.Interop.Outlook成功地完成了它,但我有一些問題。這裏是我的代碼http://pastebin.com/TwnmrYeY及以下的問題展望VSTO崩潰和減少內存消耗的方法

  1. 據我知道的工作不能在主UI線程來完成,所以我創建一個主線程seperately運行另一個線程。我循環AccessEmails函數來獲取新的傳入郵件,因爲如果有一堆傳入的郵件,ItemsEvents_ItemAddEventHandler無法處理它。 問題是後臺線程有時不會停止,當outlook已關閉。
  2. 我想等待同步發送/接收完成之前獲取所有的電子郵件,我試圖使用Application.Session.SyncObjects並添加SyncStart,SyncEnd和OnError事件處理程序,但它仍然經常崩潰。 同步正在進行時發生崩潰,但我關閉了Outlook應用程序。
  3. 如何減少內存消耗,同時通過收件箱中的所有電子郵件迭代,我用Outlook.Items遍歷所有的電子郵件和它消耗了相當大的記憶?

我希望你們可以幫助我,因爲我在這些東西中卡住了很長時間。

回答

0

首先,Outlook對象模型不能在Outlook插件的輔助線程中使用 - 從Outlook 2013開始,一旦它檢測到對輔助線程上其對象之一的訪問,Outlook就會引發異常。請注意,即使在該輔助線程中使用該exe文件,外部exes也會將所有OOM調用封送到主Outlook線程。爲了能夠在輔助線程上訪問各種Outlook對象,您需要使用擴展MAPI(C++或Delphi)或包裝如Redemption(其RDO對象系列can be used in secondary threads)。其次,雖然Application.Quit事件大多不會觸發,但您仍然可以檢測到最後一個Explorer或Inspector關閉(Explorer.Close nad Inspector.Close事件) - 只要最後一個Outlook窗口關閉,Outlook將會出口。這也可以幫助防止Outlook退出:如果您保留對Inspector或Explorer對象的引用(即使它不可見),Outlook仍將保持運行狀態。

+0

我嘗試使用任務作爲後臺線程,它適用於Outlook 2007,2010,2013甚至2016年。我不明白的是我提供了取消令牌,如果Outlook應用程序正在關閉,它將被設置爲true但取消令牌似乎從未設置爲true。插件程序將退出而不知道,有時甚至不會退出。我曾嘗試在2007年解決方案上使用Redemption,但此問題仍然存在。 –

+0

如果它在2016下工作,它只能表示所有對象被編組回到主Outlook線程。關機事件(您設置取消令牌的地方)很可能永遠不會觸發。正如我上面提到的那樣,檢查關閉的Explorers和Inspector,如果沒有剩下,請設置令牌。更確切地說,如果Explorer.Close事件觸發,並且Application.Explorers.Count == 1,則知道Outlook將關閉。 –

+0

你是什麼意思編組回來?它會在未來導致任何問題嗎?正如我所說,我創建了具有商業兌換許可證的2007年展望插件,但它非常滯後,並且通常UI會定期凍結數秒。我運行了一個輔助線程,其中調用了Redemption API。你有什麼建議讓插件運行時outlook運行更平滑嗎? –