Un'applicazione di console basata su un STA pu˛ ritardare il rilascio di componenti COM e pu˛ ritardare la chiamate ai metodi Finalize degli oggetti che il garbage collector raccoglie

Traduzione articoli Traduzione articoli
Identificativo articolo: 828988 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

Sintomi

Se un'applicazione console che si basa su un apartment a thread singolo (STA) crea e utilizza quindi i componenti COM (Component Object Model) STA nel e in cui l'applicazione console non esegue operazioni sufficienti per il pump dei messaggi COM, ad esempio chiamare il metodo Monitor.Enter , il metodo thread.join e altri utenti, potrebbero verificarsi i seguenti sintomi. Inoltre, se l'applicazione console esegue operazioni che eseguite per un lungo periodo di tempo e che non pompa messaggi, ad esempio chiamare il metodo console.ReadLine potrebbero verificarsi i seguenti sintomi:
  • Potrebbe essere ritardato il rilascio di componenti COM.
  • Le chiamate ai metodi Finalize degli oggetti che il garbage collector raccoglie potrebbero essere ritardate.
  • Chiamate a componenti COM potrebbero bloccare il thread dell'applicazione per lunghi periodi di tempo.
  • La quantitÓ di memoria utilizzata dal processo dell'applicazione STA pu˛ aumentare nel tempo.
  • Chiamate al metodo GC.WaitForPendingFinalizers potrebbero richiedere parecchio tempo per restituire.

Cause

Per fornire una chiamata a un componente COM STA correttamente, tra cui una chiamata a rilasciare il componente, il thread in cui Ŕ stato creato il componente necessario distribuzione i messaggi. Quando il codice gestito non fa riferimento a un componente COM, Ŕ necessario che il thread del finalizzatore chiamare il metodo di versione del componente. Tuttavia, se il thread STA in cui Ŕ stato creato il componente non Ŕ di distribuzione i messaggi, i blocchi di chiamata l'applicazione finchÚ il thread avvia distribuzione nuovamente i messaggi. Alcune applicazioni creano numerosi componenti COM e gli oggetti che possono essere completati. In queste applicazioni, se il thread del finalizzatore trascorre molto tempo bloccato mentre attende la STA thread ai messaggi di data pump, il thread del finalizzatore potrebbe non in grado di completare l'attivitÓ. Sia l'elenco di COM componenti per la versione e l'elenco di oggetti gestiti per finalizzare potrebbero aumentare a tempo indeterminato. Se si verifica questo problema, la quantitÓ di memoria utilizzata dal processo dell'applicazione STA pu˛ aumentare nel tempo. Inoltre, qualsiasi thread che chiama il metodo GC.WaitForPendingFinalizers potrebbe bloccare per un periodo di tempo indefinito.

Le operazioni di (IO) degli input/output di file e la console del sistema operativo, ad esempio ReadFile e WriteFile , non pump dei messaggi. PoichÚ console.ReadLine si basa sull'API del sistema operativo ReadFile, console.ReadLine non sia non pump messaggi. Di conseguenza, qualsiasi thread che chiama console.ReadLine non pump dei messaggi durante la chiamata.

Risoluzione

Per risolvere il problema, utilizzare thread MTA invece di un thread STA per creare e per comunicare con i componenti COM nelle applicazioni console. ╚ possibile impostare il thread principale dell'applicazione a un MTA. Per effettuare questa operazione, applicare il System.MTAThread attributo al metodo main, come illustrato di seguito:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
se si deve utilizza thread STA per creare componenti COM, il thread STA necessario pump dei messaggi regolarmente. Per il pump dei messaggi per un breve periodo di tempo, chiamare il metodo thread.join , come indicato di seguito:
Thread.CurrentThread.Join(100)
questa chiamata al metodo pumps messaggi per 100 millisecondi. ╚ possibile modificare il timeout in base ai requisiti dell'applicazione. Inoltre, il STA thread deve essere mai operazioni unbounded non distribuzione, ad esempio chiamata console.ReadLine . Il thread STA invece necessario disporre di un thread MTA, eseguire l'operazione e attendere il termine dell'operazione.

Riferimenti


Per ulteriori informazioni sui servizi remoti di Microsoft .NET Framework, visitare il sito di Web di Microsoft:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Per ulteriori informazioni sulla procedura di garbage collection in .NET Framework, visitare i seguenti siti Web Microsoft:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Per ulteriori informazioni sul blocco chiamate da un componente STA, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
291837INFORMAZIONI: Non Ŕ in di effettuare chiamate di blocco da un componente STA

ProprietÓ

Identificativo articolo: 828988 - Ultima modifica: lunedý 9 febbraio 2004 - Revisione: 1.4
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Chiavi:á
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 828988
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com