Loop pesan adalah sepotong kecil kode yang ada di program Windows asli apa pun. Secara kasar terlihat seperti ini:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage () Win32 API mengambil pesan dari Windows. Program Anda biasanya menghabiskan 99,9% waktunya di sana, menunggu Windows mengatakan sesuatu yang menarik terjadi. TranslateMessage () adalah fungsi pembantu yang menerjemahkan pesan keyboard. DispatchMessage () memastikan bahwa prosedur jendela dipanggil dengan pesan tersebut.
Setiap program .NET berkemampuan GUI memiliki loop pesan, itu dimulai oleh Application.Run ().
Relevansi loop pesan ke Office terkait dengan COM. Program Office adalah program yang mendukung COM, begitulah cara kerja kelas Microsoft.Office.Interop. COM menangani threading atas nama coclass COM, ini memastikan bahwa panggilan yang dibuat pada antarmuka COM selalu dibuat dari utas yang benar. Sebagian besar kelas COM memiliki kunci registri di registri yang menyatakan ThreadingModel mereka, sejauh ini yang paling umum (termasuk Office) menggunakan "Apartemen". Artinya, satu-satunya cara yang aman untuk memanggil metode antarmuka adalah dengan melakukan panggilan dari thread yang sama yang membuat objek kelas. Atau dengan kata lain: sejauh ini sebagian besar kelas COM tidak aman untuk thread.
Setiap utas yang diaktifkan COM milik apartemen COM. Ada dua macam, Apartemen Single Threaded (STA) dan Apartemen Multi Thread (MTA). Kelas COM berulir apartemen harus dibuat pada utas STA. Anda dapat melihat ini kembali di program .NET, titik masuk utas UI dari program Windows Forms atau WPF memiliki atribut [STAThread]. Model apartemen untuk utas lainnya disetel dengan metode Thread.SetApartmentState ().
Sebagian besar pipa Windows tidak akan berfungsi dengan benar jika utas UI bukan STA. Terutama Drag + Drop, clipboard, dialog Windows seperti OpenFileDialog, kontrol seperti WebBrowser, aplikasi Otomasi UI seperti pembaca layar. Dan banyak server COM, seperti Office.
Persyaratan sulit untuk thread STA adalah thread tersebut tidak boleh memblokir dan harus memompa loop pesan. Loop pesan penting karena itulah yang digunakan COM untuk mengatur panggilan metode antarmuka dari satu utas ke utas lainnya. Meskipun .NET membuat panggilan marshaling menjadi mudah (Control.BeginInvoke atau Dispatcher.BeginInvoke misalnya), sebenarnya ini adalah hal yang sangat rumit untuk dilakukan. Utas yang menjalankan panggilan harus dalam keadaan terkenal. Anda tidak bisa secara sewenang-wenang menyela utas dan memaksanya melakukan panggilan metode, yang akan menyebabkan masalah masuk kembali yang mengerikan. Sebuah utas harus "diam", tidak sibuk menjalankan kode apa pun yang mengubah status program.
Mungkin Anda bisa melihat ke mana arahnya: ya, ketika sebuah program menjalankan loop pesan, program itu menganggur. Penyusunan sebenarnya terjadi melalui jendela tersembunyi yang dibuat COM, ia menggunakan PostMessage agar prosedur jendela dari jendela itu mengeksekusi kode. Di utas STA. Loop pesan memastikan bahwa kode ini berjalan.