2

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 イベントが発生し、このリストを表示するコントロールでハンドラーが呼び出されます。これが私が達成しようとしていることを明確にすることを願っています。

4

2 に答える 2

1

内部で InvokeRequired + Invoke を処理する必要がありますItemEvents_10_SendEventHandler()

于 2010-09-03T11:31:12.363 に答える
1

多くの Forms イベントはメイン ウィンドウ スレッドで発生します。つまり、多くの場合、クロス スレッドの問題についてあまり心配する必要はありません。ただし、保証はなく、通常、COM はそのスレッドでイベントを発生させません。解決策は、メソッドへのデリゲートまたは匿名ブロックを使用して this.Invoke(..) を呼び出し、適切なスレッドで必要な作業を実行することです。これが必要かどうかをテストするには、this.InvokeRequired をテストします。

于 2010-09-03T12:26:19.230 に答える