본문 바로가기

개발공부/C#

Invoke 와 BeginInvoke 차이점

invoke와 beginInvoke의 차이점 (C# 기준)

  • *invoke*와 **beginInvoke*는 주로 델리게이트(delegate) 또는 UI 컨트롤에서 메서드를 호출할 때 사용됩니다.

둘의 차이점은 동기적(synchronous) vs 비동기적(asynchronous) 실행 방식에 있습니다.


🔍 1. 동기 vs 비동기

특징 invoke beginInvoke

실행 방식 동기(Synchronous) 호출 비동기(Asynchronous) 호출
제어 흐름 호출이 완료될 때까지 대기 즉시 반환하고 백그라운드에서 실행
리턴 값 호출 메서드의 반환 값을 반환 IAsyncResult 반환
예외 처리 즉시 발생, 호출 스레드에서 처리 호출 시점엔 발생 X, 결과 접근 시 발생

🛠️ 2. 사용 예제

🎯 1) invoke - 동기 호출 (메인 스레드 대기)

csharp
복사편집
private void UpdateUI()
{
    if (InvokeRequired)
    {
        // 메인 스레드에서 동기적으로 UI 업데이트
        Invoke(new Action(UpdateUI));
        return;
    }
    label1.Text = "UI 업데이트 완료!";
}

  • 동작:
    • 호출이 끝날 때까지 호출한 스레드는 대기
    • UI 업데이트 작업이 끝난 후 다음 코드 실행

🎯 2) beginInvoke - 비동기 호출 (백그라운드 작업)

csharp
복사편집
private void UpdateUI()
{
    if (InvokeRequired)
    {
        // 메인 스레드로 UI 업데이트를 요청하고 바로 반환
        BeginInvoke(new Action(UpdateUI));
        return;
    }
    label1.Text = "UI 업데이트 완료!";
}

  • 동작:
    • UI 업데이트를 요청한 후 바로 다음 코드로 진행
    • 결과가 필요하지 않거나, UI 응답성을 유지해야 할 때 유용

⚠️ 3. 주요 차이점 및 주의사항

  1. UI 작업 시 주의
    • UI 컨트롤은 생성된 스레드(보통 메인 UI 스레드)에서만 접근 가능
    • UI 업데이트 시 Invoke 또는 BeginInvoke 사용
  2. 성능 및 블로킹
    • Invoke는 호출한 스레드를 블로킹 → UI가 멈출 수 있음
    • BeginInvoke는 비동기 호출 → UI 응답성 유지
  3. 예외 처리
    • Invoke는 호출 시 즉시 예외 발생
    • BeginInvoke는 실행 완료 후 결과 접근 시 예외 발생

4. 언제 사용하면 좋을까?

  • UI 응답성이 중요한 경우: BeginInvoke
  • 작업 완료 후 바로 다음 작업이 필요할 때: Invoke
  • 멀티스레드 환경에서 UI 접근 시: 반드시 Invoke 또는 BeginInvoke 사용

👉 결론:

  • 동기 호출: Invoke - UI 응답성이 중요하지 않을 때
  • 비동기 호출: BeginInvoke - UI 응답성을 유지하고 싶을 때