Outlook メール アイテム オブジェクトを作成し、Send イベントを監視しています。すべて問題なく表示されますが、Send イベントが発生すると、アプリケーションのバックグラウンド スレッドでイベントが発生します。これが問題である理由は、このイベントがアプリケーションを通じて送信された電子メールの記録を作成し、それがオブジェクトのコレクションに追加されるためです。したがって、コレクションはバックグラウンド スレッドで List Changed イベントを発生させ、コレクションを表示するコントロールにクロススレッド コントロール アクセスを引き起こします。
これが私のイベント接続です:
((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レイヤーではなくビジネスオブジェクトでイベントを処理しています。Send イベント ハンドラーから呼び出されたデリゲートにより、新しいオブジェクトが内部的にリストに追加されます。これにより、リストの ListChanged イベントが発生し、このリストを表示するコントロールでハンドラーが呼び出されます。これが私が達成しようとしていることを明確にすることを願っています。