programing

Invoke()와 Begin의 차이점은 무엇입니까?호출()

telebox 2023. 5. 17. 22:46
반응형

Invoke()와 Begin의 차이점은 무엇입니까?호출()

그냥 뭐가 다른지 궁금할 뿐입니다.BeginInvoke()그리고.Invoke()그래요?

주로 각각의 용도로 사용됩니다.

편집: 스레드화 개체를 만드는 것과 해당 개체에서 호출을 호출하는 것과 그냥 호출하는 것의 차이점은 무엇입니까?BeginInvoke()대인으 ▁or ?? 아니면 아니면 그들은 같은 것입니까?

하시는 건가요?Delegate.Invoke/BeginInvoke또는Control.Invoke/BeginInvoke?

  • Delegate.Invoke동일한 스레드에서 동기적으로 실행됩니다.
  • Delegate.BeginInvoke 으실니다됩행로에서 합니다.threadpool
  • Control.InvokeUI 스레드에서 실행되지만 호출 스레드는 계속하기 전에 완료될 때까지 기다립니다.
  • Control.BeginInvokeUI 스레드에서 실행되며 호출 스레드는 완료를 기다리지 않습니다.

팀의 대답은 당신이 언제 사용하고 싶은지에 대해 언급합니다.BeginInvoke비록 그것이 대부분을 위한 것이었지만.Delegate.BeginInvoke그런 것 같아요.

Windows Forms 앱의 경우 일반적으로BeginInvoke예를 들어 교착 상태에 대해 걱정할 필요는 없지만 UI가 다음에 볼 때까지 업데이트되지 않았을 수 있다는 것을 이해해야 합니다!특히 UI 스레드가 표시 목적으로 사용하려는 데이터를 수정하면 안 됩니다.를 들어, 만약 이 를들어같이 있다면, 다과은경우음예가 있습니다.Person와 함께FirstName그리고.LastName다음과 같은 작업을 수행했습니다.

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

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

이런 한, 하만이종문없다면제가류런의지,▁unless.Control.BeginInvoke문제를 해결하는 것이 더 쉽고, 백그라운드 스레드가 정당한 이유 없이 기다릴 필요가 없습니다.가 Windows Forms를 할 수 있음을 보장합니다.Control.BeginInvoke"불태우고 잊어버리는" 방식으로 - 즉, 전화를 걸지 않고.EndInvoke이는 일반적으로 비동기 호출에는 해당되지 않습니다. 일반적으로 모든 BeginXXX에는 해당하는 EndXXX 호출이 있어야 합니다(일반적으로 콜백).

Jon Skeet의 응답을 기반으로 대리자를 호출하고 현재 스레드가 계속 진행되기 전에 실행이 완료될 때까지 기다리는 경우가 있습니다.이러한 경우 Invoke 호출이 원하는 것입니다.

멀티스레딩 응용 프로그램에서는 특히 위임자가 I/O를 수행할 경우(위임자와 스레드가 차단될 수 있음) 위임자가 실행을 완료할 때까지 스레드가 대기하지 않도록 할 수 있습니다.

이러한 경우에는 시작Invoke가 유용합니다.호출하면 딜러가 시작하도록 지시하지만 스레드는 딜러와 병렬로 다른 작업을 수행할 수 있습니다.

시작 사용호출은 코드의 복잡성을 증가시키지만 향상된 성능이 복잡성의 가치가 있는 경우가 있습니다.

사이의 차이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");
}

시작을 사용하는 경우호출하면 텍스트 업데이트와 동시에 메시지 상자가 팝업됩니다.Invoke를 사용하면 3초 수면 후 MessageBox가 팝업됩니다.따라서 비동기(BeginInvoke) 및 동기(Invoke) 호출의 효과를 표시합니다.

위임합니다.BeginInvoke()는 대리자 호출을 비동기적으로 대기열에 넣고 제어를 즉시 반환합니다.대리자를 사용하는 경우.BeginInvoke()는 대리자에게 전화해야 합니다.결과를 가져오려면 콜백 메서드의 EndInvoke()를 클릭합니다.

위임합니다.Invoke()는 같은 스레드에서 대리자를 동기적으로 호출합니다.

MSDN 문서

호출()을 사용해야 하는 이유와 시기를 추가하는 것입니다.

Invoke()와 Begin 모두지정한 코드를 디스패처 스레드에 Marship().

하지만 비긴과는 다릅니다.Invoke(), Invoke()는 디스패처가 코드를 실행할 때까지 스레드를 중지합니다.사용자가 피드백을 제공할 때까지 비동기 작업을 일시 중지해야 하는 경우 Invoke()를 사용할 수 있습니다.

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

C# 31장의 Pro WPF 참조

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

반응형