Manipulando eventos do servidor COM fora de proc no aplicativo STA gerenciado

Aparentemente, manipuladores gerenciados para eventos, provenientes de um servidor COM fora de processo não gerenciado, são chamados de volta em um thread de pool aleatório, em vez de no thread STA principal (como seria de se esperar). Eu descobri isso enquanto respondia uma pergunta sobreAutomação do Internet Explorer. No código abaixo,DocumentComplete é acionado em um thread que não é da interface do usuário"Event thread" não é o mesmo que"Main thread" na saída de depuração). Assim, eu tenho que usarthis.Invoke para mostrar uma caixa de mensagem. Para o melhor de meu conhecimento, esse comportamento é diferente de clientes COM não gerenciados, onde eventos inscritos de um segmento STA são automaticamente empacotados para o mesmo segmento.

Qual é a razão por trás de tal afastamento do comportamento tradicional COM? Até agora, não encontrei nenhuma referência confirmando isso.

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