>  기사  >  백엔드 개발  >  C# Invoke와 BeginInvoke의 차이점에 대한 자세한 설명

C# Invoke와 BeginInvoke의 차이점에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-28 15:38:211924검색

BeginInvoke 메서드가 실제로 비동기 호출을 위해 새 스레드를 여나요?

다음 코드를 참조하세요:

public 위임자 void treeinvoke();private void UpdateTreeView()
{
MessageBox.Show(System.Threading.Thread.CurrentThread.Name);
}private void 버튼1_Click(객체 송신자, 시스템 .EventArgs e)
{
System.Threading.Thread.CurrentThread.Name = "UIThread";
treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
}

실행 결과를 살펴보세요. 팝업 대화 상자. BeginInvoke에 의해 호출된 대리자가 기본적으로 UI 스레드에서 실행된다는 것을 보여주는 UIThread 를 보여줍니다.

UI 스레드에서 실행되는데 어떻게 "비동기 실행"이라고 할 수 있나요?

다음 코드를 다시 살펴보겠습니다.

public 대리자 void treeinvoke();private void UpdateTreeView()
{
MessageBox.Show(Thread.CurrentThread.Name);
}private void 버튼1_Click(객체 전송자, System.EventArgs e)
{
Thread.CurrentThread.Name = "UIThread";
스레드 th = new Thread(new ThreadStart(StartThread));
th.Start();
}private void StartThread()
{
Thread.CurrentThread. Name = "Work Thread";
treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
}

실행 결과를 다시 살펴보세요. 팝업 대화 상자에 여전히 UIThread가 표시됩니다. 이는 BeginInvoke 메서드에 의해 호출된 대리자가 어쨌든 UI 스레드에서 실행된다는 것을 보여줍니다.

그렇다면 BeginInvoke의 용도는 무엇인가요?

멀티 스레드 프로그래밍에서는 작업 스레드에서 인터페이스 표시를 업데이트해야 하는 경우가 많으며, 멀티 스레드에서 인터페이스 제어를 직접 호출하는 것은 잘못된 것입니다. 이 기사를 읽은 후 구체적인 이유를 읽을 수 있습니다. 멀티스레드에서 Winform을 호출하는 방법 전문가라면 이 글을 읽지 마세요. 어쨌든 저는 그 글을 잘 이해하지 못했습니다.

Invoke 및 BeginInvoke는 이 문제를 해결하는 것으로 나타나 다중 스레드에서 인터페이스 표시를 안전하게 업데이트할 수 있습니다.

올바른 접근 방식은 작업자 스레드의 인터페이스 업데이트와 관련된 코드를 메서드로 캡슐화하고 Invoke 또는 BeginInvoke를 통해 호출하는 것입니다. 둘 사이의 차이점은 하나는 작업자 스레드를 기다리게 하고 다른 하나는 수행한다는 것입니다. 아니다.

소위 "작업에 응답하고 동시에 노드를 추가하는 동안"은 상대적일 수 있으므로 인터페이스의 올바른 업데이트가 항상 수행되어야 하기 때문에 UI 스레드에 대한 부담이 너무 크지 않을 것입니다. 우리가 해야 할 일은 작업자 스레드에서 대부분의 계산을 인계받고 순수한 인터페이스 업데이트를 UI 스레드에 넣어 UI 스레드의 부담을 줄이는 목적을 달성하는 것입니다.

트리 노드를 업데이트하는 코드에서 실제로 작동하는 유일한 코드는 System.Threading.Thread.Sleep(100);입니다. 이는 UI 스레드에 인터페이스 메시지를 처리할 수 있는 기회를 제공합니다. 실제로 Digital Ghost가 이를 해결합니다. 다음 코드가 잘 작동하는 한 문제는 복잡합니다.

private void 버튼1_Click_(객체 전송자, System.EventArgs e)
{
TreeNode tn; for(int i=0;i {
tn=new TreeNode (i.ToString()) treeView1.Nodes[0].Nodes.Add(tn); if (i%100 == 0) Application.DoEvents();
}
}

위 내용은 C# Invoke와 BeginInvoke의 차이점에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.