본문 바로가기
C++ 200제/코딩 IT 정보

C# 크로스 스레드 작업이 잘못되었습니다, 윈폼 세이프

by vicddory 2019. 5. 22.
반응형

C# 크로스 스레드 작업이 잘못되었습니다, 윈폼 세이프


C# 입문한 분들이라면 자주 겪는 문제입니다. 저 역시 그랬고요. 여러 가지 해결책이 있는데, 그중에 아래처럼 해결하는 건 위험합니다.


1
CheckForIllegalCrossThreadCalls = false;
cs


자동차가 달리는 도로에서 차선을 지워버리는 일이라 되게 위험해요.


먼저 에러 메시지 자세히 읽어보고 해결책 알려드리겠습니다.


▷ 크로스 스레드 작업 에러

에러 메시지

InvalidOperationException이(가) 처리되지 않았습니다. 처리되지 않은 'System.InvalidOperationException' 형식의 예외가 System.Windows.Forms.dll에서 발생했습니다.

추가 정보: 크로스 스레드 작업이 잘못되었습니다. 'Text' 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 엑세스되었습니다.


문제 해결 팁:

Windows Forms 컨트롤에 크로스 스레드 호출을 만드는 방법이 예외에 대한 일반 도움말 가져옵니다.


에러 화면은 아래와 같습니다.


C# 크로스 스레드 작업이 잘못되었습니다, 윈폼 세이프c# invoke 윈폼 오류


▷ 원인

간단하게 이야기하면 UI 스레드는 독립적입니다. 컨트롤 별로 스레드가 달라요. 그래서 자신의 스레드가 아닌 곳에서 접근하면 스레드 세이프하지 않으므로 에러가 발생합니다.


▷ 왜 이렇게 귀찮게 만들었을까?

이런 규칙은 C# 제작자가 자기네들 편하려고 만든 게 아닙니다. 필요해서 만든 것이며, UI 스레드에 대한 이슈는 꾸준히 존재했습니다.


▷ 해결


크로스 스레드는 invoke로 해결할 수 있습니다. 방법은 예전에 적었던 위 포스트를 참조하시면 되며, 아직도 델리게이트를 축약하지 않고 사용하는 분들이 많은데, 되도록 축약형을 쓰세요.


위는 크로스 스레드 해결은 물론, 축약된 예제를 제공합니다.



c# 크로스 스레드 invoke delegatec# invoke 윈폼 오류



CrossThreadCalls 값을 강제로 false 변경하면 무슨 일이 벌어질지 예측이 안 됩니다. 간혹, 윈폼 요소를 public 으로 바꾸거나 이런 식으로 에러를 해결하려는 경우도 봤는데, 그렇게 하지 마세요. 나중에 더 큰 문제 생겨요.



관련 글



ⓒ written by vicddory

C# 크로스 스레드 작업이 잘못되었습니다, 윈폼 세이프

반응형