Microsoft MVP성태의 닷넷 이야기
UI Thread에 Invoke 처리관련 궁금합니다. [링크 복사], [링크+제목 복사],
조회: 12087
글쓴 사람
감사합니다.
홈페이지
첨부 파일
 

안녕하세요?
항상 도움주셔서 감사합니다.

UI Thread에 Invoke 처리관련 궁금한 점이 있어서 질문드립니다.
아래와 같이 멀티스레드로 동작하는 threadFunc()함수가 있습니다.
private void threadFunc()
{
    lock(lockobj)
    {
        mainForm.Invoke((MethodInvoker)(() =>
        {
            //멀티스레드간 동기화가 필요한 코드
        }));
    }
}

"//멀티스레드간 동기화가 필요한 코드" 부분을 메인 UI Thread에 Invoke 시켜서 처리할 경우
lock(lockobj) 부분이 없어도 무방한지 궁금합니다.

제가 생각할 때는 메인 UI Thread에 Invoke 시켜서 처리할 경우
메인 UI Thread 내에서 순차적으로 처리되기 때문에 마치 멀티스레드간 동기화가 된 것과 같이 동작하기 때문에
lock(lockobj) 부분은 없어도 될것 같은데 잘못 생각한 것일까요?

답변 주시면 감사하겠습니다.

감사합니다.









[최초 등록일: ]
[최종 수정일: 12/29/2022]


비밀번호

댓글 작성자
 



2022-12-29 07시40분
[guest] 2가지 경우를 나누어 직접 시험해보세요^^ 근데 lock을 안하려고 thread 쓰는 것 아닌가요? 그리고 task를 이용하라고 하더라고요 thread보다
[guest]
2022-12-29 08시02분
네, 생각하신 것이 맞습니다. 어차피 UI 스레드에서 직렬화되어 실행되므로 lock을 할 필요가 없습니다.

참고로, 그 코드에서 오히려 멀티 스레드에 대해 걱정해야 할 것은 Invoke 메서드의 사용입니다. 닷넷 BCL의 대부분은 정적 메서드가 아니라면 thread-safe하지 않은데요, 다음의 문서에 나오듯이,

Control.Invoke Method
; https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invoke

대상 컨트롤만 (위 코드 예제의 경우 mainForm) 정상적으로 생성된 이후라면 Invoke/BeginInvoke/EndInvoke/CreateGraphics 메서드는 모두 thread-safe하다고 명시하고 있습니다.
정성태
2022-12-29 09시47분
[감사합니다.] 긴가민가 했었는데 답변 주셔서 감사합니다.
[guest]

1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...
NoWriterDateCnt.TitleFile(s)
5658한예지 donator5/9/202214192교재 689, 690쪽(async/await) 질문입니다. [5]
5657C#초보5/8/202212647초보 단순 질문 입니다.,ㅠ [1]
5656부탁드립...5/6/20221484532bit dll 을 64bit dll 화 [2]
5655감사합니...5/5/202214646UI 스레드 관련 질문드립니다. [4]파일 다운로드1
5653고석주5/3/202212853첨부된 이미지처럼 dll 을 어떻게 추가해야 하는지 문의드립니다. [1]파일 다운로드1
5652감사합니...5/2/202211730프로그램 종료되면 리소스(관리, 비관리)는 알아서 해제 되나요? [2]
5651윤식4/26/202212779상속 구조 관련 질문드립니다. [8]
5650김기헌4/19/202212479WPF 리소스 관련 질문드립니다 [3]
5649주니어4/15/202211404ffmpeg 질문 있습니다! [2]
5648주니어개...4/13/202212052컴파일된 코드를 원시코드로 바꾸려면 어떻게해야하나요? [1]파일 다운로드1
5647장성욱4/7/202211864코어지정 CPU사용률 관련 질문 [1]
5646서형주4/6/202212192List에 여러개의 class 객체를 만들어 넣을때, 객체의 method들도 같이 생성되어 메모리를 차지하나요? [1]
5645김인태4/6/202211507윈도우즈 서버의 AD 계정 생성 조건이 있을까요? [1]
5644ㅇㅇ4/6/202212518c# 프로그램을 이용하여 리눅스상에 파일 생성이 가능한가요? [1]
5643유필재4/5/202212874TCP클라이언트 연결 및 통신관련하여 문의드려요 [1]
5642차가워4/4/202212821UdpClient 패킷 수신 문의 [4]
5641장성욱4/4/202212629코어 할당 및 cpu 부하테스트 질문 [7]
5640icoo...4/4/202213304웹가든에서 메모리 동적 업데이트 방법 [1]
5639차가워4/4/202213943c++ 서버 c# 클라이언트 호환 문의 [1]
5638초급4/3/202214007c# sql server 연동 [1]
5637따봉이4/1/202215385Winform Form Load 후 자동 캡쳐관련 [1]파일 다운로드1
5636김철순3/31/202214318WPF에서 Richtext의 View 문의 [5]
5635guest3/30/202213014안정적인 pinning이 가능하네요. [3]파일 다운로드1
5633꿀주세요3/30/202212961선생님 마우스 클릭이벤트 질문이 있습니다. [4]
5632김현수3/30/202213729Remote Desktop으로 접속시 WPF UI 가 다시 그려지는 이벤트를 막을 수 없을까요? [3]
5631김기헌3/24/202213118WPF 컨트롤의 그래픽 처리관련 질문드립니다 [2]파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...