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.
Questa è un'app di Windows. Non un'app Web.
Il primo messaggio da VS è una finestra pop-up che dice: "Nessun simbolo viene caricato per qualsiasi frame dello stack di chiamate. Il codice sorgente non può essere visualizzato." Quando viene cliccato, ottengo: " ContextSwitchDeadlock è stato rilevato ", insieme a un lungo messaggio riprodotto di seguito.
L'errore si verifica in un ciclo che esegue la scansione di una DataTable. Per ogni riga, utilizza un valore chiave (HIC #) dalla tabella come parametro per un comando Sql. Il comando viene utilizzato per creare un SqlDataReader che restituisce una riga. I dati vengono confrontati. Se viene rilevato un errore, viene aggiunta una riga a una seconda DataTable.
L'errore sembra essere correlato al tempo necessario per l'esecuzione della procedura (ovvero dopo 60 secondi), non al numero di errori rilevati. Non penso sia un problema di memoria. Nessuna variabile è dichiarata all'interno del ciclo. Gli unici oggetti che vengono creati sono gli SqlDataReaders e si trovano in Uso delle strutture. Aggiungi System.GC.Collect () non ha avuto effetto.
Il db è un sito SqlServer sullo stesso laptop.
Non ci sono aggeggi o gadget fantasiosi nel modulo.
Non sono a conoscenza di nulla in questo proc che è molto diverso da quello che ho fatto dozzine di volte prima. Ho visto l'errore prima, ma mai su una base coerente.
Qualche idea, qualcuno?
Testo di errore completo: CLR non è stato in grado di passare dal contesto COM 0x1a0b88 al contesto COM 0x1a0cf8 per 60 secondi. Il thread proprietario del contesto / appartamento di destinazione sta probabilmente eseguendo un'attesa non di pompaggio o elaborando un'operazione di esecuzione molto lunga senza pompare i messaggi di Windows. Questa situazione ha generalmente un impatto negativo sulle prestazioni e può persino portare all'applicazione che non risponde o all'utilizzo della memoria che si accumula continuamente nel tempo. Per evitare questo problema, tutti i thread STA (single threaded apartment) dovrebbero utilizzare primitive di attesa di pompaggio (come CoWaitForMultipleHandles) e pompare regolarmente i messaggi durante le operazioni di lunga durata.