Microsoft MVP성태의 닷넷 이야기
UI 스레드의 Invoke 질문있습니다. [링크 복사], [링크+제목 복사],
조회: 13170
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

선생남 안녕하세요!
namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "";
            Thread th = new Thread(DoSomething);            
            th.Start();
        }
    
        // ★★★    
        private void DoSomething()
        {
            DoLongTimeWork();         
            label1.Invoke((Action)delegate () {
                label1.Text = "종료";
            });
        }
        
        private void DoLongTimeWork()
        {
            Thread.Sleep(3000);
        }
    }
}

위의 코드 중 ★★★가 표시된 메서드를 아래와 같이 수정해도 정상적으로 동작하더라구요.
private void DoSomething()
{
    DoLongTimeWork();
    label1.Text = "종료";
}

폼 위에 있는 컨트롤은 UI 스레드로부터 접근한 것이 아니면 받아들이지 않기 때문에
Invoke 를 사용해 UI 스레드 쪽에서 Label에 "종료"라고 표시하는 것으로 알고 있지만
혹시나 해서 .Invoke((Action)delegate () { } 를 사용되지 않아도 정상적으로 동작하는지 궁금해서 지워보았는데
정상적으로 동작하더라구요..
혹시 컴파일러가 자동으로 .Invoke((Action)delegate () { }를 만들어서 붙여주나요?









[최초 등록일: ]
[최종 수정일: 5/3/2021]


비밀번호

댓글 작성자
 



2021-05-03 01시11분
아래의 글을 참고하세요.

UI 요소의 접근은 반드시 그 UI를 만든 스레드에서! - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/12537
정성태
2021-05-05 12시32분
[한예지] 이해가 되지 않아 조금 더 배운 후, 다시 읽어보도록 할게요......
[guest]
2021-05-05 12시49분
간단하게 요약하자면, 질문에서 언급하신 것처럼 "폼 위에 있는 컨트롤은 UI 스레드로부터 접근한 것이 아니면 받아들이지 않기 때문에 Invoke 를 사용해 UI 스레드 쪽에서..." 실행해야 하는 것이 맞습니다. 왜냐하면, UI 요소에 대해 다중 스레드에서 접근하는 것이 안전하지 "않을 수" 있기 때문입니다.

달리 말해, 100% 위험한 것은 아니므로 코드에서 허용이 되긴 합니다. 단지, 비주얼 스튜디오에서 F5 키를 이용해 디버깅 모드로 실행하면 (보수적으로 대처하도록 내부 코딩이 되어 있으므로) System.InvalidOperationException 예외가 발생하게 됩니다.
정성태
2021-05-05 02시12분
[한혜지] 댓글 보고 바로 이해했습니다!! 답변해주셔서 정말 감사드립니다~!
[guest]

1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5912guest4/25/202316758[참고 - 초보용] Sqlite 디비는 double이 없고 Real이 대신합니다 [3]
5911guest4/24/202311524Form1.cs와 외부 class.cs와 통신 (static async method포함) [4]파일 다운로드1
5910guest4/24/202310987Async 메서드와 try~catch [1]
5909guest4/22/202311992Visual Studio 구매 시(1인 개발자) [4]
5908guest4/22/202311668텅빈 원그리기 [5]
5907민성4/21/202311176안녕하세요 서버 백업 문제에 대해서 [2]
5906guest4/21/202311551Dispatcher 서비스 구현 질문 [1]
5905guest4/20/202312552tabControl의 tabPage가 여러 개일 때 순서를 바꾸기가 까다롭네요 [5]
5904guest4/18/202312483[신규자료첨부] DLL 'SQLite.Interop.dll'을 찾을 수 없습니다 [4]파일 다운로드1
5903guest4/18/202311225fileSystemWatcher 이벤트 관련 질문입니다 [2]
5902guest4/17/202312324c#으로 USB 관련 질문 [2]
5901guest4/17/202310633내솔루션 판매 시 1.0.0.0 폴더와 Sqlite 배포 [5]
5900guest4/17/202312698DLL 'SQLite.Interop.dll'을 찾을 수 없습니다 [2]파일 다운로드1
5899guest4/17/202311364Dictionary와 Linq [4]
5898차가워4/17/202311364CNTK 교육 문의 [1]
5897guest4/17/202311112Socket스레드와 UI thread [4]
5896HAN4/16/202310990c언어 return 에 대해 궁금한게 있어요. [1]파일 다운로드1
5895guest4/15/202311304Drag and Drop - 모든 컨트롤 [2]
5894송부장4/14/202312833[질문] Visual Studio 2022에서 '도구 상자 항목 선택'의 'COM 구성 요소' 탭에서 ActiveX 목록이 보이지 않습니다. [3]파일 다운로드2
5893감사합니...4/14/202310916오라클 OLEDB방식 접속 후 SELECT 'TEST' TEST_VALUE FROM DUAL의 값이 이상합니다. [1]
5892한무4/14/202310854C# 으로 백그라운드에서 워드를 실행하여 매크로 실행이 가능 할까요? [2]
5891리세4/14/202311663안녕하세요.C# 서버프로그램에서의 Mysql 쿼리문제(다중쿼리 실행)에 대해 문의드립니다. [2]
5890guest4/14/202312566C# 프리랜서로 돈 벌려면 성태님 책 마스터하면 되나요? [6]
5889전예찬4/14/202310902C# 파일 복사 관련 질문 드립니다. [3]
5888정경구4/12/202311011C# 첫 환경 세팅과 관련해서 [4]
5887HAN4/12/202311101안녕하세요 파이썬도 공유 가능 할까요? [1]
1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...