Obsługa wątków w pakiecie Office
Ten artykuł zawiera informacje na temat sposobu obsługi wątków w modelu obiektów pakietu Microsoft Office. Model obiektów pakietu Office nie jest bezpieczny wątkiem, ale można pracować z wieloma wątkami w rozwiązaniu pakietu Office. aplikacja pakietu Office lications to serwery modelu obiektów składowych (COM). Model COM umożliwia klientom wywoływanie serwerów COM w dowolnych wątkach. W przypadku serwerów COM, które nie są bezpieczne wątkami, COM zapewnia mechanizm serializacji współbieżnych wywołań, dzięki czemu tylko jeden wątek logiczny jest wykonywany na serwerze w dowolnym momencie. Ten mechanizm jest znany jako model apartamentu jednowątkowego (STA). Ponieważ wywołania są serializowane, wywołujące mogą być blokowane przez okresy czasu, gdy serwer jest zajęty lub obsługuje inne wywołania w wątku w tle.
Dotyczy: informacje w tym temacie dotyczą projektów na poziomie dokumentu i projektów dodatków VSTO. Zobacz Funkcje dostępne według aplikacja pakietu Office lication i typu projektu.
Wiedza wymagana w przypadku korzystania z wielu wątków
Aby pracować z wieloma wątkami, musisz mieć co najmniej podstawową wiedzę na temat następujących aspektów wielowątkowość:
Interfejsy API systemu Windows
Pojęcia wielowątkowane modelu COM
Współbieżność
Synchronizacja
Marshaling
Aby uzyskać ogólne informacje na temat wielowątku, zobacz Managed threading (Zarządzane wątkowość).
Pakiet Office działa w głównym stacie. Zrozumienie implikacji tego rozwiązania pozwala zrozumieć, jak używać wielu wątków w pakiecie Office.
Podstawowy scenariusz wielowątkowy
Kod w rozwiązaniach pakietu Office zawsze działa w głównym wątku interfejsu użytkownika. Możesz chcieć wygładzić wydajność aplikacji, uruchamiając oddzielne zadanie w wątku w tle. Celem jest wykonanie dwóch zadań pozornie jednocześnie zamiast jednego zadania, po którym następuje drugie, co powinno skutkować wygładzonym wykonywaniem (głównym powodem korzystania z wielu wątków). Możesz na przykład mieć kod zdarzenia w głównym wątku interfejsu użytkownika programu Excel, a w wątku w tle możesz uruchomić zadanie, które zbiera dane z serwera i aktualizuje komórki w interfejsie użytkownika programu Excel z danymi z serwera.
Wątki w tle wywołujące model obiektów pakietu Office
Gdy wątek w tle wykonuje wywołanie aplikacja pakietu Office licacji, wywołanie jest automatycznie marshalowane przez granicę STA. Nie ma jednak gwarancji, że aplikacja pakietu Office lication może obsłużyć wywołanie w czasie, gdy wątek w tle go wykonuje. Oto kilka możliwości:
Aplikacja pakietu Office lication musi pompować komunikaty, aby wywołanie mogło wejść. Jeśli wykonuje duże przetwarzanie bez zwracania tego czasu, może to zająć trochę czasu.
Jeśli inny wątek logiczny znajduje się już w mieszkaniu, nowy wątek nie może wejść. Dzieje się tak często, gdy wątek logiczny wchodzi w aplikacja pakietu Office licację, a następnie wykonuje ponowne wywołanie do mieszkania obiektu wywołującego. Aplikacja jest zablokowana w oczekiwaniu na zwrócenie tego wywołania.
Program Excel może być w stanie takim, że nie może natychmiast obsłużyć wywołania przychodzącego. Na przykład aplikacja pakietu Office lication może wyświetlać modalne okno dialogowe.
W przypadku możliwości 2 i 3 com udostępnia interfejs IMessageFilter . Jeśli serwer go implementuje, wszystkie wywołania są wprowadzane za pośrednictwem metody HandleIncomingCall . W przypadku możliwości 2 połączenia są automatycznie odrzucane. W przypadku możliwości 3 serwer może odrzucić wywołanie, w zależności od okoliczności. Jeśli wywołanie zostanie odrzucone, obiekt wywołujący musi zdecydować, co zrobić. Zwykle obiekt wywołujący implementuje IMessageFilter, w tym przypadku zostanie powiadomiony o odrzuceniu przez metodę RetryRejectedCall .
Jednak w przypadku rozwiązań utworzonych przy użyciu narzędzi programistycznych pakietu Office w programie Visual Studio międzyoperacyjna com konwertuje wszystkie odrzucone wywołania na wartość COMException ("Filtr komunikatu wskazuje, że aplikacja jest zajęta"). Za każdym razem, gdy wykonasz wywołanie modelu obiektów w wątku w tle, musisz być przygotowany do obsługi tego wyjątku. Zazwyczaj wiąże się to z ponawianiem próby przez określony czas, a następnie wyświetleniem okna dialogowego. Można jednak również utworzyć wątek w tle jako sta, a następnie zarejestrować filtr komunikatów dla tego wątku, aby obsłużyć ten przypadek.
Poprawnie uruchom wątek
Podczas tworzenia nowego wątku STA ustaw stan mieszkania na STA przed rozpoczęciem wątku. W poniższym przykładzie kodu pokazano, jak to zrobić.
System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);
t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();
Aby uzyskać więcej informacji, zobacz Managed threading best practices (Najlepsze rozwiązania dotyczące zarządzanych wątków).
Formularze bez moderowania
Formularz bez moderowania umożliwia jakąś interakcję z aplikacją podczas wyświetlania formularza. Użytkownik wchodzi w interakcję z formularzem, a formularz współdziała z aplikacją bez zamykania. Model obiektów pakietu Office obsługuje formularze bez moderowania zarządzanego; jednak nie należy ich używać w wątku w tle.