기술나눔

C# 비동기 프로그래밍 Invoke, BeginInvoke, endInvoke 사용법 및 기능

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

C# 비동기 프로그래밍 Invoke, BeginInvoke, endInvoke 사용법 및 기능

1. 호출

Invoke의 본질은 메소드일 뿐이며 메소드는 객체를 통해 호출되어야 합니다.

일반적으로 Invoke가 실제로 사용되는 상황은 두 가지뿐입니다.

제어 호출

DelegateInvoke

즉, Invoke 앞에는 컨트롤이나 대리자 개체가 옵니다.

제어 호출

컨트롤의 Invoke는 일반적으로 크로스 스레드 액세스 문제를 해결하는 데 사용됩니다. 예를 들어 버튼을 조작하려면 버튼.Invoke를 사용해야 하지만 텍스트 레이블을 조작하려면 label.Invoke를 사용해야 합니다. 다들 매우 번거롭게 생각하실 텐데요, 버튼과 라벨을 모두 조작하고 싶은 경우에는 함께 쓸 수 있나요? 확신하는.

기본 폼은 Form이고 Form은 자연스럽게 Control을 상속하므로 Form에도 Form.Invoke를 직접 호출할 수 있는 Invoke 메서드가 있습니다. 이것이 바로 일반적인 this.Invoke입니다. 이것이 일부 Invoke의 앞에 아무것도 없는 이유입니다. 실제로는 앞에 이것이 있지만 생략되어 있습니다.

예:

this.Invoke(new Action(() =>{ button1.Text = "关闭";}));

DelegateInvoke

Delegate's Invoke는 실제로 실행을 위해 스레드 풀에서 Delegate 메서드를 호출하며 이를 호출하는 UI 스레드를 차단합니다.

  1. void PrintMessage(string message) 
  2.     { 
  3.         Console.WriteLine(message); 
  4.     } 
  5.     MyDelegate myDelegate = PrintMessage; 
  6.     myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`

시작Invoke、끝Invoke

우리는 C#에 async/await, BackGroudWorker 클래스 및 TPL(Task Parallel Library)이 존재한다는 것을 이미 알고 있습니다. 물론 C#에는 여전히 비동기 프로그래밍을 지원하는 몇 가지 오래된 패턴이 있습니다.

  1.     delegate long MyDel(int first, int second);
  2.     
  3.     class Program
  4.     {
  5.         static long Sum(int x, int y)
  6.         {
  7.             Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());
  8.             Thread.Sleep(2000);
  9.             return x + y;
  10.         }
  11.     
  12.         static void Main(string[] args)
  13.         {
  14.             MyDel del = new MyDel(Sum);
  15.     
  16.             Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());
  17.             IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
  18.             Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());
  19.     
  20.             Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());
  21.     
  22.             long result = del.EndInvoke(iar);
  23.             Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());
  24.     
  25.             Console.WriteLine("After EndInvoke:  {0}", result);
  26.     
  27.             Console.ReadKey();
  28.     
  29.         }
  30.     }

위 코드는 MyDel 대리자를 정의하고 호출 시 Sum 메서드를 해당 개체에 전달합니다. 일반적으로 이 대리자 개체를 호출하면 호출 목록에 포함된 메서드가 호출됩니다. 메소드를 호출하는 것과 마찬가지로 이 작업은 동기적으로 수행됩니다.

그러나 대리자 개체의 호출 목록에 하나의 메서드(참조 메서드)만 있는 경우 이 메서드를 비동기적으로 실행할 수 있습니다. 이를 수행하는 데 BeginInovke 및 EndInvoke가 사용됩니다. 다음과 같은 방법으로 사용할 수 있습니다.

* ① BeginInvoke 메서드를 호출하면 독립 스레드에서 참조 메서드 실행을 시작하고 즉시 원래 스레드로 돌아갑니다. 원래 스레드는 계속될 수 있으며 참조 메서드는 원하는 스레드에서 병렬로 실행됩니다.
* ② 프로그램이 완료된 비동기 메서드의 결과를 얻으려면 BeginInvoke에서 반환된 IAsyncResult의 IsCompleted 속성을 확인하거나 대리자의 EndInvoke 메서드를 호출하여 대리자 실행이 완료될 때까지 기다릴 수 있습니다.

위의 사용 프로세스는 세 가지 모드로 이어집니다.

* ①완료될 때까지 대기. 원본 스레드가 비동기식 메서드를 시작하고 다른 처리를 수행한 후 계속하기 전에 비동기식 메서드가 완료될 때까지 중단하고 기다립니다.

* ②폴링을 통해 원래 스레드는 시작된 스레드가 완료되었는지 정기적으로 확인합니다. 완료되지 않은 경우 계속해서 다른 작업을 수행할 수 있습니다.

* ③ 시작 스레드의 참조 발급이 완료된 후 시작 스레드가 콜백 메소드를 호출하고 콜백 메소드가 결과를 처리합니다. EndInvoke를 호출하기 전의 비동기 메서드입니다.

참고 웹사이트:

C#_C#에서 Invoke 및 BeginInvoke의 실제 적용에 대한 자세한 설명 Tutorial_Script Home

C# 스레드 위임의 사용법 BeginInvoke 및 EndInvoke_C# Tutorial_Script 홈