development

Invoke ()와 BeginInvoke ()의 차이점은 무엇입니까

big-blog 2020. 2. 26. 07:54
반응형

Invoke ()와 BeginInvoke ()의 차이점은 무엇입니까


그냥 것 사이의 차이가 궁금 BeginInvoke()하고 Invoke()있습니까?

주로 각각에 사용될 것입니다.

편집 : 스레딩 객체를 만들고 호출 BeginInvoke()하는 것과 델리게이트를 호출하는 것의 차이점은 무엇입니까 ? 아니면 같은 것입니까?


Delegate.Invoke / BeginInvoke 또는 Control.Invoke / BeginInvoke를 의미합니까?

  • Delegate.Invoke : 동일한 스레드에서 동 기적으로 실행합니다.
  • Delegate.BeginInvoke : 스레드 풀 스레드에서 비동기 적으로 실행합니다.
  • Control.Invoke : UI 스레드에서 실행되지만 호출 스레드는 계속하기 전에 완료를 기다립니다.
  • Control.BeginInvoke : UI 스레드에서 실행되며 호출 스레드는 완료를 기다리지 않습니다.

Tim의 답변은 BeginInvoke를 사용하고 싶을 때 언급합니다. 대부분 Delegate를 향한 것이지만, 의심합니다.

Windows Forms 앱의 경우 일반적으로 BeginInvoke를 사용 하는 것이 좋습니다 . 예를 들어 교착 상태에 대해 걱정할 필요는 없지만 다음 번에 UI를 업데이트 할 때 UI가 업데이트되지 않았 음을 이해해야합니다. 특히 UI 스레드가 표시 목적으로 사용할 데이터를 수정해서는 안됩니다. 예를 들어, FirstName 및 LastName 속성을 가진 Person이 있고 다음을 수행 한 경우 :

person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";

그러면 UI에 "Keyser Spacey"가 표시 될 수 있습니다. "Kevin Soze"를 표시 할 수있는 외부 기회가 있지만 메모리 모델의 기이함을 통해서만 가능합니다.

그러나 이런 종류의 문제가 없으면 Control.BeginInvoke를 쉽게 찾을 수 있으며 백그라운드 스레드가 아무런 이유없이 기다릴 필요가 없습니다. Windows Forms 팀은 Control.BeginInvoke를 "시작 및 종료"방식으로 (즉, EndInvoke를 호출하지 않고) 사용할 수 있음을 보증했습니다. 일반적으로 비동기 호출에는 해당되지 않습니다. 일반적으로 모든 BeginXXX에는 일반적으로 콜백에서 해당 EndXXX 호출이 있어야합니다.


Jon Skeet의 응답을 바탕으로 델리게이트를 호출하고 현재 스레드가 계속되기 전에 실행이 완료 될 때까지 기다리는 경우가 있습니다. 이 경우 호출 호출이 원하는 것입니다.

다중 스레딩 응용 프로그램에서, 특히 해당 대리자가 I / O를 수행하는 경우 (대리자 및 스레드 블록을 만들 수있는) 스레드가 대리자에서 실행을 완료하기를 기다리지 않을 수 있습니다.

이 경우 BeginInvoke가 유용합니다. 호출하면 대리자에게 시작하도록 지시하지만 스레드는 대리자와 동시에 다른 작업을 수행 할 수 있습니다.

BeginInvoke를 사용하면 코드가 복잡해 지지만 성능이 향상 될 때가 있습니다.


차이 Control.Invoke()Control.BeginInvoke(), 인

  • BeginInvoke()GUI 스레드에서 비동기 작업을 예약합니다. 비동기 작업이 예약되면 코드가 계속 진행됩니다. 얼마 후 (정확한시기를 모르는 경우) 비동기 작업이 실행됩니다.
  • Invoke() GUI 스레드에서 비동기 작업을 실행하고 작업이 완료 될 때까지 기다립니다.

논리적 결론은 전달한 대리자 Invoke()가 매개 변수를 벗어나거나 반환 값 BeginInvoke()을 가질 수 있지만 전달하는 대리자는 할 수 없다는 것입니다 (EndInvoke를 사용하여 결과를 검색해야 함).


차이의 영향을 볼 수있는 짧고 효과적인 예를 들기 위해

new Thread(foo).Start();

private void foo()
{
  this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
    (ThreadStart)delegate()
    {
        myTextBox.Text = "bing";
        Thread.Sleep(TimeSpan.FromSeconds(3));
    });
  MessageBox.Show("done");
}

BeginInvoke를 사용 하면 MessageBox가 텍스트 업데이트와 동시에 팝업됩니다. Invoke를 사용 하면 3 초 동안 잠자기 후 MessageBox가 나타납니다. 따라서 비동기 ( BeginInvoke ) 및 동기 ( Invoke ) 호출 의 효과를 보여줍니다 .


Delegate.BeginInvoke ()는 대리자의 호출을 비동기 적으로 대기열에 넣고 즉시 제어를 반환합니다. Delegate.BeginInvoke ()를 사용하는 경우 콜백 메소드에서 Delegate.EndInvoke ()를 호출하여 결과를 가져와야합니다.

Delegate.Invoke ()는 동일한 스레드에서 대리자를 동 기적으로 호출합니다.

MSDN 기사


Invoke ()를 사용하는 이유와시기를 추가하기 만하면됩니다.

Invoke () 및 BeginInvoke ()는 모두 지정한 코드를 디스패처 스레드에 마샬링합니다.

그러나 BeginInvoke ()와 달리 Invoke ()는 디스패처가 코드를 실행할 때까지 스레드를 중단시킵니다. 사용자가 일종의 피드백을 제공 할 때까지 비동기 작업을 일시 중지해야하는 경우 Invoke ()를 사용할 수 있습니다.

예를 들어, Invoke ()를 호출하여 확인 / 취소 대화 상자를 표시하는 코드 스 니펫을 실행할 수 있습니다. 사용자가 버튼을 클릭하고 마샬링 된 코드가 완료되면 invoke () 메서드가 반환되고 사용자의 응답에 따라 행동 할 수 있습니다.

C # 챕터 31의 Pro WPF 참조

참고 URL : https://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke



반응형