선생남 안녕하세요!
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]