2011-12-07 16 views
6

Quando si esegue la mia applicazione dopo qualche secondo si è verificata questa eccezione. ciò che è un'eccezione e come è possibile gestire questa eccezionecontesto Deadlock degli switch

Il CLR è stato in grado di passare da contesto COM 0x647f10 a COM contesto 0x648080 per 60 secondi. Il thread che possiede il contesto/appartamento di destinazione è molto probabile che effettui un'attesa non pumping o elaborando un'operazione molto lunga senza pompare messaggi Windows . Questa situazione ha generalmente un impatto negativo sulle prestazioni e può persino portare l'applicazione a diventare non reattiva o l'utilizzo della memoria che si accumula continuamente nel tempo. Per evitare questo problema, tutti i thread thread singolo apartment (STA) devono utilizzare il pumping attendere le primitive (come CoWaitForMultipleHandles) e pompare regolarmente i messaggi durante le operazioni a esecuzione prolungata.

+8

Leggere il testo con ogni parola in maiuscolo è fastidioso –

+0

La descrizione di ciò che è accaduto è tutto lì dentro, anche se può essere un po 'oscuro come l'hai attivato. Per ottenere aiuto devi essere molto più specifico su cosa fa la tua applicazione e come è costruita. –

+0

Ho lavorato su Sudoku con algoritmo generico e forse un sacco di tempo per trovare risposta e questa eccezione si è verificata. –

risposta

8

Ciò si verifica in genere se si dispone di qualcosa che blocca il thread dell'interfaccia utente e si utilizzano componenti COM.

L'approccio migliore qui è spostare l'operazione di lunga durata in un thread in background. Questo lascia la tua interfaccia utente reattiva, il che significa anche che i messaggi COM possono pompare correttamente. BackgroundWorker è uno strumento utile per questo.

0

Nella mia esperienza, questo risulta dall'avere un'attività di lunga durata nel thread principale di un modulo di Windows. Potresti utilizzare un BackgroundWorker per eseguire l'attività. Il vantaggio immediato di ciò sarà che l'interfaccia utente non si bloccherà mentre l'attività è in esecuzione. Si potrebbe anche esaminare l'implementazione di una barra di avanzamento utilizzando l'evento ProgressChanged.