Событие отправки электронной почты Outlook возникло в фоновом потоке - PullRequest
2 голосов
/ 03 сентября 2010

Я создаю объект Почты Outlook и наблюдаю за событием Отправить.Все выглядит хорошо, но когда срабатывает событие Send, событие вызывается в фоновом потоке моего приложения.Причина этого заключается в том, что это событие создает запись электронного письма, отправленного через мое приложение, которое добавляется в коллекцию объектов.Поэтому коллекция вызывает событие List Changed в фоновом потоке, вызывая многопотоковый доступ к элементу управления, отображающему коллекцию.

Вот мое подключение события:

((Outlook.ItemEvents_10_Event)item).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(ItemSendWatcher_Send);
* 1005Событие подключается к базовому классу, который содержит ссылку на отправляемое сообщение и делегат для вызова при возникновении события отправки.Это позволяет мне передать экземпляр объекта электронной почты делегату.

Это мой обработчик:

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;
    }

Это правильное поведение для этого события или я что-то не так делаю, когдастроит объект?Спасибо за любую помощь.

Редактировать: Просто чтобы уточнить, я не обрабатываю событие на уровне пользовательского интерфейса, а в бизнес-объекте.Делегат, вызванный из обработчика события отправки, вызывает добавление нового объекта в список внутри страны, что вызывает событие ListChanged списка, в результате чего вызывается обработчик в элементе управления, отображающем этот список.Я надеюсь, что это проясняет то, чего я пытаюсь достичь.

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Множество событий Forms генерируется в потоке главного окна, что означает, что вам часто не нужно слишком беспокоиться о проблемах между потоками. Однако нет никаких гарантий, и COM обычно не будет вызывать события в этом потоке. Решение состоит в том, чтобы вызвать this.Invoke (..) с делегатом метода или анонимным блоком для выполнения необходимой работы в нужном потоке. Чтобы проверить, нужно ли это, проверьте this.InvokeRequired.

1 голос
/ 03 сентября 2010

Вам нужно обработать InvokeRequired + Invoke внутри ItemEvents_10_SendEventHandler()

...