Supporto del threading in Office

Questo articolo fornisce informazioni sul supporto del threading nel modello a oggetti di Microsoft Office. Il modello a oggetti di Office non è thread-safe, ma è possibile usare più thread in una soluzione Office. app Office licazioni sono server COM (Component Object Model). COM consente ai client di chiamare i server COM in thread arbitrari. Per i server COM che non sono thread-safe, COM fornisce un meccanismo per serializzare le chiamate simultanee in modo che nel server venga eseguito un solo thread logico in qualsiasi momento. Questo meccanismo è noto come modello apartment a thread singolo (STA). Poiché le chiamate vengono serializzate, i chiamanti potrebbero essere bloccati per periodi di tempo mentre il server è occupato o gestisce altre chiamate in un thread in background.

Si applica a: le informazioni contenute in questo argomento si applicano ai progetti a livello di documento e ai progetti di componente aggiuntivo VSTO. Vedere Funzionalità disponibili per app Office lication e tipo di progetto.

Conoscenza necessaria quando si usano più thread

Per usare più thread, è necessario avere almeno una conoscenza di base degli aspetti seguenti del multithreading:

  • API di Windows

  • Concetti multithreading COM

  • Concorrenza

  • Sincronizzazione

  • Marshaling

    Per informazioni generali sul multithreading, vedere Threading gestito.

    Office viene eseguito nel sta principale. Comprendere le implicazioni di questo consente di comprendere come usare più thread con Office.

Scenario di multithreading di base

Il codice nelle soluzioni Office viene sempre eseguito nel thread principale dell'interfaccia utente. È possibile ottenere prestazioni ottimali dell'applicazione eseguendo un'attività separata in un thread in background. L'obiettivo è completare due attività apparentemente in una sola volta invece di un'attività seguita dall'altra, che dovrebbe comportare un'esecuzione più fluida (il motivo principale per usare più thread). Ad esempio, potrebbe essere presente il codice evento nel thread principale dell'interfaccia utente di Excel e in un thread in background è possibile eseguire un'attività che raccoglie dati da un server e aggiorna le celle nell'interfaccia utente di Excel con i dati del server.

Thread in background che chiamano nel modello a oggetti di Office

Quando un thread in background effettua una chiamata al app Office lication, la chiamata viene sottoposta automaticamente al marshalling attraverso il limite sta. Tuttavia, non esiste alcuna garanzia che il app Office lication possa gestire la chiamata al momento in cui il thread in background lo rende. Le possibilità sono diverse:

  1. Il app Office lication deve pompare i messaggi affinché la chiamata abbia la possibilità di entrare. Se si esegue un'elaborazione intensa senza produrre questo potrebbe richiedere tempo.

  2. Se un altro thread logico si trova già nell'apartment, il nuovo thread non può entrare. Questo accade spesso quando un thread logico entra nella app Office lication e quindi effettua una chiamata ribesante all'appartamento del chiamante. L'applicazione è bloccata in attesa della restituzione della chiamata.

  3. Excel potrebbe trovarsi in uno stato in modo che non possa gestire immediatamente una chiamata in ingresso. Ad esempio, il app Office lication potrebbe visualizzare una finestra di dialogo modale.

    Per le possibilità 2 e 3, COM fornisce l'interfaccia IMessageFilter . Se il server lo implementa, tutte le chiamate vengono immesse tramite il metodo HandleIncomingCall . Per la possibilità 2, le chiamate vengono rifiutate automaticamente. Per la possibilità 3, il server può rifiutare la chiamata, a seconda delle circostanze. Se la chiamata viene rifiutata, il chiamante deve decidere cosa fare. In genere, il chiamante implementa IMessageFilter, nel qual caso riceverà una notifica del rifiuto dal metodo RetryRejectedCall.

    Tuttavia, nel caso di soluzioni create usando gli strumenti di sviluppo di Office in Visual Studio, l'interoperabilità COM converte tutte le chiamate rifiutate a un COMException ("Il filtro messaggi indica che l'applicazione è occupata"). Ogni volta che si effettua una chiamata a un modello a oggetti su un thread in background, è necessario essere pronti a gestire questa eccezione. In genere, ciò comporta la ripetizione di tentativi per un determinato periodo di tempo e quindi la visualizzazione di una finestra di dialogo. Tuttavia, è anche possibile creare il thread in background come STA e quindi registrare un filtro di messaggio per tale thread per gestire questo caso.

Avviare correttamente il thread

Quando si crea un nuovo thread STA, impostare lo stato apartment su STA prima di avviare il thread. Nell'esempio di codice seguente viene illustrato come procedere.

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

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

Per altre informazioni, vedere Procedure consigliate per il threading gestito.

Forme senza modalità

Un modulo senza modalità consente un tipo di interazione con l'applicazione mentre viene visualizzato il modulo. L'utente interagisce con il modulo e il modulo interagisce con l'applicazione senza chiudere. Il modello a oggetti di Office supporta moduli senza modalità gestita; tuttavia, non devono essere usati in un thread in background.