Visual Studio:콘텍스트 스위치 데드록
해결할 수 없는 에러 메세지가 표시되고 있습니다.Visual Studio 또는 디버거에서 비롯됩니다.최종 오류 상태가 VS, 디버거, 내 프로그램 또는 데이터베이스 중 어느 쪽에 있는지 알 수 없습니다.
이것은 Windows 앱입니다.웹 앱이 아닙니다.
VS로부터의 첫 번째 메시지는 팝업박스로 "콜 스택프레임에 심볼은 로드되지 않습니다.소스 코드를 표시할 수 없습니다."클릭하면 ContextSwitchDeadlock was detected (콘텍스트 스위치 데드록이 검출되었습니다)라는 메시지가 나타납니다.
DataTable을 스캔하는 루프에서 오류가 발생합니다.각 행에 대해 테이블의 키(HIC #) 값을 SqlCommand의 매개 변수로 사용합니다.이 명령어는 한 줄을 반환하는 SqlDataReader를 만드는 데 사용됩니다.데이터를 비교합니다.오류가 감지되면 행이 두 번째 DataTable에 추가됩니다.
이 오류는 발견된 오류 수가 아니라 절차를 실행하는 데 걸리는 시간(즉, 60초 후)과 관련이 있는 것으로 보입니다.기억력의 문제는 아닌 것 같아요.루프 내에서 선언된 변수는 없습니다.생성되는 개체는 SqlDataReaders뿐이며 구조 사용 중을 참조하십시오.시스템 추가.GC.Collect()는 효과가 없었습니다.
db는 같은 노트북에 있는SqlServer 사이트입니다
폼에는 화려한 장비나 가젯이 없습니다.
나는 이 프로시저에서 내가 수십 번 했던 것과 크게 다른 어떤 것도 알지 못한다.나는 이전에도 실수를 본 적이 있지만, 일관되게 본 적은 없다.
생각나는 사람?
전체 오류 텍스트:CLR은 60초 동안 COM 컨텍스트0x1a0b88에서 COM 컨텍스트0x1a0cf8로 이행할 수 없었습니다.행선지 콘텍스트/아파트를 소유하는 스레드는, 대부분의 경우, 비펌핑 대기 또는 Windows 메시지를 펌핑하지 않고 장시간 실행 작업을 처리하고 있습니다.이 상황은 일반적으로 퍼포먼스에 부정적인 영향을 미쳐 애플리케이션이 응답하지 않거나 시간이 지남에 따라 메모리 사용량이 지속적으로 증가할 수 있습니다.이 문제를 회피하려면 모든 Single Threaded Aparty(STA; 싱글스레드아파트) 스레드에서 펌핑 대기 프리미티브(CoWaitForMultipleHandles 등)를 사용하여 장시간 실행 중에 정기적으로 메시지를 펌핑해야 합니다.
ContextSwitchDeadlock
코드에는 문제가 있는 것이 아니라 가능성이 있다는 것을 의미합니다.★★★★★에Debug > Exceptions
에서 [ ]를 전개합니다.Managed Debugging Assistants
이.ContextSwitchDeadlock
이네이블입니다.
이 옵션을 사용하지 않도록 설정하면 항목을 처리하는 데 시간이 오래 걸릴 때 VS에서 더 이상 경고를 표시하지 않습니다.경우에 따라서는 장기간에 걸친 작업을 유효하게 실시할 수 있습니다.디버깅을 하고 있는데 처리 중에 회선을 정지한 경우에도 도움이 됩니다.문제를 파고들기 전에 불만을 제기하고 싶지 않습니다.
Visual Studio 2017에서 ContextSwitchDeadlock 옵션을 선택 해제했습니다.
[ Debug ]> [ Windows ]> [ Exception Settings ]
예외 설정 창:ContextSwitchDeadlock 옵션을 꺼줍니다.
Pedro가 말했듯이 코드를 사용할 경우 메시지 펌프를 방해하는 디버거에 문제가 있습니다.
그러나 UI 스레드에서 장시간 실행 작업을 수행하는 경우 Application을 호출합니다.DoEvents(): 메시지큐를 명시적으로 펌핑하여 현재 메서드로 제어를 되돌립니다.
다만, 이 경우 UI 스레드에서 처리를 실시하여 UI를 깔끔하게 유지할 수 있도록 설계도를 검토하는 것을 추천합니다.
앱의 메인 UI 스레드에서 이 작업을 하고 있는 것 같습니다.UI 스레드는 도착 시 Windows 메시지를 펌핑하지만 데이터베이스 호출로 차단되어 있기 때문에 이를 수행할 수 없습니다.이로 인해 시스템 전체의 메시지에 문제가 발생할 수 있습니다.
장시간 실행 중인 작업을 위해 백그라운드 스레드를 만들고 작업이 진행되는 동안 사용자를 위해 "바쁘다" 대화 상자를 띄우는 것을 검토해야 합니다.
이 예외를 무효로 하고 싶지 않은 경우는, 적어도 60초에 1회, 몇개의 메세지의 펌핑을 실시합니다.그러면 이 예외가 발생하지 않습니다.시스템을 호출해 보십시오.스레드화스레드.현재스레드.가끔 조인(10)합니다.메시지를 전송하기 위해 실행할 수 있는 다른 콜이 있습니다.
위의 솔루션은 경우에 따라서는 적절하지만 유닛 테스트 중에 솔루션이 [Debug]으로 설정되어 있지 않은 상태에서 테스트 탐색기에서 "선택한 테스트"를 디버깅하려고 할 때 이 문제가 발생하는 다른 시나리오가 있습니다.
이 경우 솔루션을 Release 또는 Debug로 설정된 솔루션에서 변경해야 합니다.이 경우 ContextSwitchDeadlock을 변경해도 도움이 되지 않습니다.
에러 메세지가 너무 심해서, 디버깅 설정이라고 하는 명백한 것을 확인하지 않았기 때문에, 저도 이것을 놓쳤습니다.
Visual Studio 2017 스페인어 버전.
"Depurar" -> "Ventanas" -> "Configuraciones de Exciones"
"ContextSwitchDeadlock"을 검색합니다.그런 다음 선택을 취소합니다.또는 숏컷
Ctrl+D,E
최고입니다.
이 문제를 해결하려면 contextswitch deadlock을 꺼야 합니다.
디버깅 -> 예외... -> MDA 노드 전개 -> 콘텍스트스위치 데드록의 선택을 해제합니다.
이 문제가 발생한 경우에도 수정사항은 스레드에 "대기"를 추가하는 것이었습니다.
Await Task.WhenAll(taskList.ToArray())
Await Task.Run(myAction)
이 오류가 발생하여 쿼리를 비동기(...)로 전환했습니다.ToListAsync()).이제 괜찮아.
언급URL : https://stackoverflow.com/questions/578357/visual-studio-contextswitchdeadlock
'programing' 카테고리의 다른 글
SQL Server에서 JOIN을 사용하여 테이블을 업데이트하시겠습니까? (0) | 2023.04.07 |
---|---|
SQL Server 레코드 세트를 루프하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
sql 서버에서 더블을 나타내는 것은 무엇입니까? (0) | 2023.04.07 |
SQL Server의 SYSNAME 데이터 유형은 무엇입니까? (0) | 2023.04.07 |
SQL Server에 동등한 것이 없는 경우 테이블 생성 (0) | 2023.04.07 |