Ho ricevuto un messaggio di errore che non riesco a risolvere. Proviene da Visual Studio o dal debugger. Non sono sicuro se la condizione di errore finale sia in VS, nel debugger, nel mio programma o nel database.Visual Studio: ContextSwitchDeadlock
Questa è un'applicazione Windows. Non è un'app web.
Il primo messaggio di VS è una finestra popup che dice: "Nessun simbolo viene caricato per nessun frame di stack di chiamate.Il codice sorgente non può essere visualizzato." Quando si fa clic, viene visualizzato: "ContextSwitchDeadlock è stato rilevato", insieme a un messaggio lungo riprodotto di seguito.
L'errore si verifica in un loop che analizza un DataTable. Per ogni riga, utilizza un valore chiave (HIC#) dalla tabella come parametro per un SqlCommand. Il comando viene utilizzato per creare un SqlDataReader che restituisce una riga. I dati sono confrontati. Se viene rilevato un errore, una riga viene aggiunta a un secondo DataTable.
L'errore sembra essere relativo a quanto tempo impiega la procedura per l'esecuzione (vale a dire dopo 60 secondi), non quanti errori vengono rilevati. Non penso che sia un problema di memoria. Nessuna variabile è dichiarata all'interno del ciclo. Gli unici oggetti che vengono creati sono SqlDataReaders e sono in Uso delle strutture. Aggiungi System.GC.Collect() non ha avuto alcun effetto.
Il db è un sito SqlServer sullo stesso laptop.
Non ci sono aggeggi fantastici o gadget sul modulo.
Non sono a conoscenza di nulla in questo processo che è molto diverso da quello che ho fatto decine di volte prima. Ho visto l'errore prima, ma mai su una base coerente.
Qualche idea, qualcuno?
completa errore Testo: Il CLR è stato in grado di passare da contesto COM 0x1a0b88 al contesto COM 0x1a0cf8 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.
destro su! Grazie. Dovevo andare su Personalizza e aggiungere eccezioni al menu Debug. Non l'aspetto più intuitivo dell'interfaccia utente. Strumenti \ Personalizza, quindi Riorganizza i comandi (pulsante), quindi seleziona Debug dall'elenco a discesa in alto a destra, quindi Aggiungi (pulsante). Meno male! – SeaDrive
Sì, sembra che alcune installazioni abbiano quelle nel menu e altre no. L'ho visto anche con altre voci di menu utili, e devo ancora capire cosa li attiva o disattiva di default. – Pedro
'ctrl-alt-e' porta la finestra di dialogo delle eccezioni. –