Microsoft MVP성태의 닷넷 이야기
[WPF] Threadpool사용 시 크리티컬 섹션 대응 질문 입니다. [링크 복사], [링크+제목 복사]
조회: 7083
글쓴 사람
종범
홈페이지
첨부 파일
 

하나의 TCP 또는 UDP로 데이터를 받아 WPF의 TextBox에 출력하는 것은 할 수 있습니다.

하지만 여러개의 수신 Thread를 만들고 각 Thread마다 While문에서 수신을 대기합니다.
그리고 데이터를 수신받으면 WPF의 TextBox에 출력하고 싶은데 여기서 크리티컬 섹션이 발생합니다.

WPF의 TextBox에 출력하는 함수를 여러 Thread가 사용하려고 하니 크리티컬 섹션이 나타나는 것을 알고 있습니다.

흔히 찾을 수 있는 방법은 뮤택스, 락등을 이용하여 순차적으로 함수를 사용할 수 있도록 하는 방법입니다.
하지만 저는 순차적이 아닌 동시에 사용할 수 있도록 하고 싶습니다.

하나의 함수를 여러 Thread가 동시에 사용할 수 있는 방법이 있나요???



----
예전에도 이런 경우가 있어서 new로 만든 객체인 this를 Thread가 있는 클래스로 넘기고 받은 this의 TextBox에 출력하도록 했는데 이래도 크리티컬이 나오네요.








[최초 등록일: ]
[최종 수정일: 12/4/2020]


비밀번호

댓글 작성자
 



2020-12-04 04시51분
문제를 단순히 "하나의 함수를 여러 Thread"에서 호출한다는 식으로 보면 안 됩니다.

하나의 함수라도, 공유 데이터가 있으면 어떤 식으로든지 lock을 걸어야 합니다. 심지어 그것이 UI 요소(TextBox)라면 반드시 그 UI 요소를 생성한 스레드에서 접근할 수 있도록 해야 합니다. 즉, 선택지가 없습니다.

참고로 다음의 글도 읽어보시고.

UI 요소의 접근은 반드시 그 UI를 만든 스레드에서!
; https://www.sysnet.pe.kr/2/0/11561
정성태
2020-12-04 06시01분
[종범] 질문에 정보가 조금 부족했습니다.
UI 생성을 관리하는 클래스에서 TextBox가 있는 클래스 9개를 생성(new)하고, 생성된 textBox 클래스에서 Udp 클래스를 생성(new)하는 식으로 코드를 만들었습니다.
그래서 저는 생성된 TextBox가 각각 다른 형태로 있을 거라 생각하고 udp 클래스에 TextBox의 this를 넘겨서 this의 TextBox에 수신받은 데이터를 출력하도록 했는데 지금 이 부분이 잘못된것 같습니다.

그럼 udp클래스에 while을 돌리고 있는 Threadpoll에서 수신 데이터를 받아 출력하려고 하면 TextBox클래스에 전역 변수를 만들어 놓고 udp클래스에서 이 변수를 setting하고 setting된 변수를 출력하는 식으로 방향을 잡으면 될까요...?
[guest]
2020-12-04 07시55분
그래서, 제가 최소화된 예제를 올려 달라고 하는 것입니다. 자꾸 스무고개하게 되니까 서로 질문과 답변을 반복하게 되는 결과가 나옵니다.

자신의 상황을 잘 코드로 표현해 보세요. 여기서 Udp가 중요한 것은 아닙니다. 스레드를 쓰고 있다면 그냥 그 스레드에서 어떻게 TextBox에 값을 넣고 있는지, 그래서 뭐가 문제인지 표현하면 됩니다. 그런 예제 프로젝트를 올려 주면 누가 봐도 상황을 이해하고 적절한 답변을 한 번에 할 수 있습니다.
정성태
2020-12-08 11시41분
[ryujh] 안녕하세요. 해본 적은 없어서 뭐라고 자세히 알려드릴 수 는 없습니다.
                                          r -스레드풀-> TCP/UDP 클래스
                                          V
TextBox <- UI스레드 -> ConcurrentDictionary (키:datetime+스레드번호, 밸류:필요한것)
                                          A
                                          ㄴ-스레드풀-> TCP/UDP 클래스

위와 같이 TextBox 와 TCP/UDP 에 대해 서로 접근하지 않게 중간에 저장소를 둬봐야겠다는 생각이 들었습니다. 참고바랍니다.
[guest]

1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...
NoWriterDateCnt.TitleFile(s)
5589초급12/22/20214716c# -> 라즈베리파이(db 접속)시 에러 발생 [7]
5588김지신12/21/20214671안녕하세요 String 변수 참조 주소 질문입니다. [2]
5587이완호12/17/20215764C# SharpDX 화면 캡쳐 관련해서 질문 드립니다. [1]
5586조미김12/16/20214935윈폼에서 메인 스레드와 UI 스레드의 차이점 질문드립니다 [4]
5585김준희12/16/20215700C# 윈폼 TCP/IP 데이터 연속으로 보낼때 [1]
5583난인간이다12/10/20214754.net 6 dynamic pgo 활성화 및 예상되는 문제 [1]
5582김준희12/9/202111898C# TCP/IP 통신시 연결 끊김 에러 [1]
5581김시준12/9/20215274닷넷에서 파일 delete 함수는 왜 비동기가 없는 것인가요? [2]
5580카짜프로...12/7/20216526패턴매칭 -튜퓰비교에 관한 오류사항과 궁금증 [1]파일 다운로드1
5579카짜프로...12/6/2021578311.12 메서드 중복정의에 대한 질문 [1]
5577감사합니...11/30/20214808visual studio 2015 update 3를 다운받을려고 하는데 x64/x86 차이점이 뭘까요? [2]
5576노홍구11/29/20214706C# 으로 USB 스캐너 프린터 리셋하기 입니다. [1]
5575베라11/23/20214770event handler 관련 문의 [2]
5574박원웅11/22/20215080닷넷 프레임워크 산출물의 배포시 해당 환경에 프레임워크 버전이 설치되어 있지 않는 경우를 고려한 배포방법은? [3]
5573mijin11/21/20214903System.NullReferenceException 에 대한 질문 [1]
5572김현진11/21/20215068C# list.Clear() 호출에 대한 문의 드립니다. [4]
5571한예지 donator11/18/20215013무설치 프로그램 원리가 궁금합니다. [2]
5570초보11/16/20215511주식데이터 초당 수신 건수를 구하고 있는데 처리속도가 느려서요 [2]
5569카짜프로...11/14/20216400381페이지 UTC에대한 언급이 그리니치 천문대 시간으로 되어있는게 맞나요? [1]
5568카짜프로...11/14/20216471그림 5.20, 그림 5.22 언급 오류 [1]
5567Edun11/2/20215366쿼리문을 코드로 어떻게 처리할 수 있을까요? [2]
5566민성10/26/20215193Linq에 관해서 [1]
5565pass...10/25/20216469wpf에서 Cefsharp를 AnyCPU로 작업 했는데 실행이 되지 않습니다. [4]
5564초보10/21/20214687오버라이드 관련 질문드립니다 [2]
5562서지훈10/20/20214682win32 api 문의 드립니다. (EnableMenuItem) [5]
5561Edun10/15/20215122도와주세요!! 팝업 띄우는 더블클릭 이벤트!! 부탁드립니다 ㅠㅠ [4]파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...