Sdílet prostřednictvím


Podpora vláken v Office

Tento článek obsahuje informace o tom, jak je vlákno podporováno v systém Microsoft Office objektovém modelu. Objektový model Office není bezpečný pro vlákna, ale v řešení Office je možné pracovat s více vlákny. aplikace Office lications jsou servery modelu COM (Component Object Model). Com umožňuje klientům volat servery COM na libovolných vláknech. Pro servery COM, které nejsou bezpečnými vlákny, poskytuje com mechanismus pro serializaci souběžných volání, aby se na serveru kdykoli spustilo pouze jedno logické vlákno. Tento mechanismus se označuje jako model STA (single-threaded apartment). Vzhledem k tomu, že se volání serializují, můžou být volající zablokovaní po dobu, kdy je server zaneprázdněný nebo zpracovává jiná volání na vlákně na pozadí.

Platí pro: Informace v tomto tématu platí pro projekty na úrovni dokumentu a projekty doplňků VSTO. Viz Funkce dostupné podle typu aplikace Office lication a projektu.

Znalost požadovaná při použití více vláken

Pokud chcete pracovat s více vlákny, musíte mít alespoň základní znalosti následujících aspektů multithreadingu:

  • Rozhraní API systému Windows

  • Koncepty modelu COM s více vlákny

  • Souběžnost

  • Synchronizace

  • Zařazování

    Obecné informace o multithreadingu naleznete v tématu Spravované vlákno.

    Office běží v hlavním STA. Pochopení důsledků tohoto postupu umožňuje pochopit, jak používat více vláken s Office.

Základní scénář multithreadingu

Kód v řešeních Office se vždy spouští na hlavním vlákně uživatelského rozhraní. Výkon aplikace můžete vyhladit spuštěním samostatné úlohy ve vlákně na pozadí. Cílem je dokončit dva úkoly zdánlivě najednou místo jednoho úkolu následovaného druhým, což by mělo vést k plynulejšímu provádění (hlavní důvod použití více vláken). Můžete mít například kód události v hlavním vlákně uživatelského rozhraní Excelu a na vlákně na pozadí můžete spustit úlohu, která shromažďuje data ze serveru a aktualizuje buňky v uživatelském rozhraní Excelu s daty ze serveru.

Vlákna na pozadí, která volají do objektového modelu Office

Když vlákno na pozadí volá aplikace Office lication, volání se automaticky zařazuje přes hranice STA. Neexistuje však žádná záruka, že aplikace Office lication dokáže zpracovat volání v době, kdy ho vlákno na pozadí zvládá. Existuje několik možností:

  1. Aplikace Office lication musí pumpovat zprávy, aby hovor měl možnost vstoupit. Pokud provádí náročné zpracování bez toho, aby to mohlo nějakou dobu trvat.

  2. Pokud je v bytě již jiné logické vlákno, nové vlákno nemůže vstoupit. K tomu často dochází, když logické vlákno vstoupí do aplikace Office lication a pak provede opakované volání zpět do volajícího bytu. Aplikace je blokovaná a čeká na vrácení volání.

  3. Excel může být ve stavu, kdy nemůže okamžitě zpracovat příchozí hovor. Například aplikace Office lication může zobrazovat modální dialogové okno.

    Pro možnosti 2 a 3 poskytuje COM IMessageFilter rozhraní. Pokud server implementuje, všechny volání zadejte prostřednictvím HandleIncomingCall metoda. Pro možnost 2 jsou hovory automaticky odmítnuty. Pro možnost 3 může server odmítnout volání v závislosti na okolnostech. Pokud je hovor odmítnut, volající se musí rozhodnout, co má udělat. Za normálních okolností volající implementuje IMessageFilter, v takovém případě by bylo upozorněno na zamítnutí RetryRejectedCall metoda.

    V případě řešení vytvořených pomocí vývojových nástrojů Office v sadě Visual Studio ale interop modelu COM převede všechna odmítnutá volání na COMException (Filtr zpráv označuje, že aplikace je zaneprázdněná). Kdykoli provedete volání objektového modelu ve vlákně na pozadí, musíte být připraveni zpracovat tuto výjimku. Obvykle to zahrnuje opakování po určitou dobu a zobrazení dialogového okna. Můžete však také vytvořit vlákno na pozadí jako STA a pak zaregistrovat filtr zpráv pro toto vlákno pro zpracování tohoto případu.

Správně spusťte vlákno.

Při vytváření nového vlákna STA nastavte stav bytu na STA před zahájením vlákna. Následující příklad kódu ukazuje, jak to provést.

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

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

Další informace najdete v tématu Osvědčené postupy spravovaných vláken.

Bezmodální formuláře

Bezmodální formulář umožňuje určitý typ interakce s aplikací při zobrazení formuláře. Uživatel pracuje s formulářem a formulář komunikuje s aplikací bez zavření. Objektový model Office podporuje spravované bezmodální formuláře; neměly by se však používat na vlákně na pozadí.