Bagikan melalui


Dukungan utas di Office

Artikel ini menyediakan informasi tentang bagaimana utas didukung dalam model objek Microsoft Office. Model objek Office tidak aman, tetapi dimungkinkan untuk bekerja dengan beberapa utas dalam solusi Office. aplikasi Office likasi adalah server Model Objek Komponen (COM). COM memungkinkan klien untuk memanggil server COM pada utas arbitrer. Untuk server COM yang tidak aman utas, COM menyediakan mekanisme untuk menserialisasikan panggilan bersamaan sehingga hanya satu utas logis yang dijalankan di server kapan saja. Mekanisme ini dikenal sebagai model apartemen berulir tunggal (STA). Karena panggilan diserialisasikan, penelepon mungkin diblokir untuk jangka waktu tertentu saat server sibuk atau menangani panggilan lain pada utas latar belakang.

Berlaku untuk: Informasi dalam topik ini berlaku untuk proyek tingkat dokumen dan proyek Add-in VSTO. Lihat Fitur yang tersedia berdasarkan aplikasi Office likasi dan jenis proyek.

Pengetahuan yang diperlukan saat menggunakan beberapa utas

Untuk bekerja dengan beberapa utas, Anda harus memiliki setidaknya pengetahuan dasar tentang aspek multithreading berikut:

  • API Windows

  • Konsep multithreadED COM

  • Konkurensi

  • Sinkronisasi

  • Marshaling

    Untuk informasi umum tentang multithreading, lihat Utas terkelola.

    Office berjalan di STA utama. Memahami implikasinya memungkinkan untuk memahami cara menggunakan beberapa utas dengan Office.

Skenario multithreading dasar

Kode di solusi Office selalu berjalan pada utas UI utama. Anda mungkin ingin memuluskan performa aplikasi dengan menjalankan tugas terpisah pada utas latar belakang. Tujuannya adalah untuk menyelesaikan dua tugas yang tampaknya sekaligus alih-alih satu tugas diikuti oleh tugas lainnya, yang seharusnya menghasilkan eksekusi yang lebih lancar (alasan utama untuk menggunakan beberapa utas). Misalnya, Anda mungkin memiliki kode peristiwa di utas UI Excel utama, dan pada utas latar belakang Anda mungkin menjalankan tugas yang mengumpulkan data dari server dan memperbarui sel di UI Excel dengan data dari server.

Utas latar belakang yang memanggil model objek Office

Ketika utas latar belakang melakukan panggilan ke aplikasi Office likasi, panggilan secara otomatis dirusak di seluruh batas STA. Namun, tidak ada jaminan bahwa aplikasi Office likasi dapat menangani panggilan pada saat utas latar belakang membuatnya. Ada beberapa kemungkinan:

  1. Aplikasi Office likasi harus memompa pesan agar panggilan memiliki kesempatan untuk masuk. Jika itu melakukan pemrosesan berat tanpa menghasilkan ini bisa memakan waktu.

  2. Jika utas logis lain sudah ada di apartemen, utas baru tidak dapat masuk. Ini sering terjadi ketika utas logis memasuki aplikasi Office likasi dan kemudian melakukan panggilan masuk kembali ke apartemen penelepon. Aplikasi diblokir menunggu panggilan tersebut kembali.

  3. Excel mungkin dalam keadaan skema sehingga tidak dapat segera menangani panggilan masuk. Misalnya, aplikasi Office likasi mungkin menampilkan dialog modal.

    Untuk kemungkinan 2 dan 3, COM menyediakan antarmuka IMessageFilter . Jika server mengimplementasikannya, semua panggilan masuk melalui metode HandleIncomingCall . Untuk kemungkinan 2, panggilan secara otomatis ditolak. Untuk kemungkinan 3, server dapat menolak panggilan, tergantung pada keadaannya. Jika panggilan ditolak, pemanggil harus memutuskan apa yang harus dilakukan. Biasanya, pemanggil mengimplementasikan IMessageFilter, dalam hal ini akan diberi tahu tentang penolakan dengan metode RetryRejectedCall.

    Namun, dalam kasus solusi yang dibuat dengan menggunakan alat pengembangan Office di Visual Studio, interop COM mengonversi semua panggilan yang COMException ditolak ke ("Filter pesan menunjukkan bahwa aplikasi sibuk"). Setiap kali Anda melakukan panggilan model objek pada utas latar belakang, Anda harus siap untuk menangani pengecualian ini. Biasanya, yang melibatkan mencoba kembali untuk jumlah waktu tertentu lalu menampilkan dialog. Namun, Anda juga dapat membuat utas latar belakang sebagai STA dan kemudian mendaftarkan filter pesan untuk utas tersebut untuk menangani kasus ini.

Memulai utas dengan benar

Saat Anda membuat utas STA baru, atur status apartemen ke STA sebelum Anda memulai utas. Cuplikan kode berikut menunjukkan cara melakukannya:

System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);

t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();

Untuk informasi selengkapnya, lihat Praktik terbaik utas terkelola.

Formulir tanpa mode

Bentuk tanpa mode memungkinkan beberapa jenis interaksi dengan aplikasi saat formulir ditampilkan. Pengguna berinteraksi dengan formulir, dan formulir berinteraksi dengan aplikasi tanpa menutup. Model objek Office mendukung formulir tanpa mode terkelola; namun, mereka tidak boleh digunakan pada utas latar belakang.