2010-02-08 13 views
5

Ho un programma che ho eseguito e nel mezzo ottengo questo messaggio:strano messaggio sui thread in C#

Gestito Debug Assistant 'ContextSwitchDeadlock' ha rilevato un problema in 'C: \ Documents and Settings \ Lena G \ My Documents \ SchoolStuff \ Informazioni IR \ Home Work \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost.exe '. Ulteriori informazioni: Il CLR non è stato in grado di passare dal contesto COM 0x3407968 al contesto COM 0x3407ad8 per 60 secondi. Il thread che possiede il contesto/l'appartamento di destinazione è più probabile che effettui un'attesa senza pompaggio o che elabori un'operazione molto lunga senza pompare messaggi di Windows. Generalmente, questa situazione ha un impatto negativo sulle prestazioni e può persino portare a un'applicazione non reattiva o all'utilizzo della memoria che si accumula continuamente nel tempo. Per evitare questo problema, tutti i thread a thread singolo apartment (STA) devono utilizzare i primitivi di attesa di pompaggio (come CoWaitForMultipleHandles) e pompare regolarmente i messaggi durante le operazioni a esecuzione prolungata.

Capisco che ha qualcosa a che fare con il fatto che funziona per 60 secondi senza fermarsi o qualcosa del genere? Come è un problema? Ho anche messo [STAThread] prima che il principale del mio programma perché se tolgo poi mi mostra questo messaggio:

un'eccezione non gestita di tipo 'System.Threading.ThreadStateException' si è verificato in System.Windows.Forms.dll Ulteriori informazioni: Il thread corrente deve essere impostato sulla modalità apartment a thread singolo (STA) prima che sia possibile effettuare chiamate OLE. Assicurati che la tua funzione principale abbia STAThreadAttribute segnato su di essa. Questa eccezione viene sollevata solo se un debugger è collegato al processo.

Qualcuno sa come posso risolvere questo problema?

Grazie in anticipo,

Lena

risposta

1

Si tratta di un avviso generato quando si effettuano chiamate su un oggetto ActiveX da un thread in background e il thread principale è bloccato. Forse più probabile: c'era un bug nella versione retail di Visual Studio 2005 che ha fatto scattare questo avviso senza una buona ragione. È stato corretto nel Service Pack 1, assicurati di averlo installato. Ancora un altro soluzione è di chiudere in su. Debug + Eccezioni, Assistenti debug gestiti, deselezionare l'avviso ContextSwitchDeadlock. Ma usa SP1 se non ce l'hai.

+0

Se si disattiva il deadlock dell'interruttore di contesto, si può fare del male? Sto usando Visual Studio 2008 .. –

+0

Niente sta per esplodere. Potresti effettivamente avere un punto morto. Lo scoprirai abbastanza veloce, il tuo programma si bloccherà. –

2

È necessario assicurarsi che il thread che possiede il componente COM non viene "bloccato" via di elaborazione per> 60 secondi.

Cosa sta probabilmente accadendo è che avete un oggetto COM in una forma, e si sta facendo un lavoro sul thread dell'interfaccia utente. Se l'interfaccia utente viene bloccata dall'elaborazione per> 60 secondi, il componente COM può presentare un reclamo.

Considerare l'utilizzo di un'istanza BackgroundWorker per gestire il processo di esecuzione prolungata. Ciò spingerebbe il lavoro su un thread in background e consentirà al componente COM di elaborare i messaggi senza reclami.