Obsługa zdarzeń z serwera COM poza procesem w zarządzanej aplikacji STA

Najwyraźniej, zarządzane procedury obsługi zdarzeń, pochodzące z niezarządzanego serwera COM poza procesem, są wywoływane z losowego wątku puli, a nie z głównego wątku STA (jak można się spodziewać). Odkryłem to, odpowiadając na pytanieAutomatyzacja przeglądarki Internet Explorer. W poniższym kodzieDocumentComplete jest uruchamiany na wątku innym niż UI (tak"Event thread" nie jest taki sam jak"Main thread" w wyjściu debugowania). Tak więc muszę użyćthis.Invoke aby wyświetlić okno wiadomości. Według mojej najlepszej wiedzy, to zachowanie różni się od niezarządzanych klientów COM, gdzie zdarzenia subskrybowane z wątku STA są automatycznie zestawiane z powrotem do tego samego wątku.

Jaki jest powód takiego odejścia od tradycyjnego zachowania COM? Do tej pory nie znalazłem żadnych referencji potwierdzających to.

using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;

namespace WinformsIE
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs ev)
        {
            var ie = (SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"));
            ie.Visible = true;
            Debug.Print("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);
            ie.DocumentComplete += (object browser, ref object URL) =>
            {
                string url = URL.ToString();
                Debug.Print("Event thread: {0}", Thread.CurrentThread.ManagedThreadId);
                this.Invoke(new Action(() =>
                {
                    Debug.Print("Action thread: {0}", Thread.CurrentThread.ManagedThreadId);
                    var message = String.Format("Page loaded: {0}", url);
                    MessageBox.Show(message);
                }));
            };
            ie.Navigate("http://www.example.com");
        }
    }
}

questionAnswers(1)

yourAnswerToTheQuestion