방법: 스레드에서 컨트롤 조작
BackgroundWorker는 BeginInvoke 메서드를 대체하고 여기에 다른 기능을 추가하여 새로 도입된 구성 요소이지만 이전 버전과의 호환성 및 이후 사용 가능성을 고려하여 BeginInvoke 메서드를 계속 유지하도록 선택할 수 있습니다.자세한 내용은 BackgroundWorker 구성 요소 개요를 참조하십시오.
다중 스레딩은 클래스 모듈에서 프로세서를 많이 사용하는 프로시저를 실행하는 데 가장 적합합니다.다른 구성 요소와 달리 개별 스레드에서 컨트롤의 메서드를 직접 호출하는 데는 문제가 있습니다.컨트롤에 영향을 미치는 메서드는 그 컨트롤을 생성한 스레드에서만 실행되어야 합니다.한 스레드에서 호출을 마샬링하여 스레드 경계를 넘어 다른 스레드로 전달하면 시스템 리소스를 많이 사용하는 부담이 따르므로 다른 스레드에 있는 컨트롤을 자주 호출하지 말아야 합니다.다른 스레드에서 직접 호출하면 부담이 크고 응용 프로그램 성능이 떨어집니다.최악의 경우 응용 프로그램에서 교착 상태가 발생하여 실행이 중지될 수 있습니다.
그러나 스레드에서 컨트롤의 메서드를 호출해야 하는 경우도 있습니다.예를 들어, 스레드의 동작에 대한 응답으로 폼의 단추를 사용하지 못하게 설정하거나 디스플레이를 업데이트하는 메서드를 호출할 수 있습니다..NET Framework에는 모든 스레드에서 안전하게 호출할 수 있는 메서드가 있습니다. 이러한 메서드는 다른 스레드가 소유하고 있는 컨트롤과 상호 작용하는 메서드를 호출하는 데 사용할 수 있습니다.Invoke 메서드를 사용하면 컨트롤의 메서드를 동기적으로 실행할 수 있는 반면 BeginInvoke 메서드를 사용하면 비동기적으로 실행할 수 있습니다.이러한 메서드를 사용하려면 메서드와 동일한 시그니처를 사용하여 대리자를 선언해야 합니다.그런 다음 호출할 메서드에 적절한 대리자를 제공하여 폼에 있는 컨트롤의 Invoke 또는 BeginInvoke 메서드를 호출할 수 있습니다.필요한 매개 변수는 모두 Object 안에 포함된 상태로 메서드에 전달됩니다.
다른 스레드가 소유하고 있는 컨트롤과 연관된 메서드를 호출하려면
호출한 메서드와 동일한 시그니처를 사용하여 대리자를 선언합니다.
다음 예제에서는 Integer 및 String 매개 변수를 사용하여 대리자를 선언하는 방법을 보여 줍니다.
Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _ aString as String)
public delegate void myDelegate(int anInteger, string aString);
컨트롤을 사용하여 다른 스레드가 소유하고 있는 컨트롤을 조작하는 메서드를 호출합니다.
[!참고]
메서드에 매개 변수가 필요한 경우 Object 안에 매개 변수를 포함하여 제공할 수 있습니다.
메서드를 동기적으로 호출하려면 Control.Invoke 메서드를 호출합니다.
Label1.Invoke(New myDelegate(AddressOf myMethod), New _ Object() {1, "This is the string"})
Label1.Invoke(new myDelegate(myMethod), new Object[] {1, "This is the string"});
메서드를 비동기적으로 호출하려면 Control.BeginInvoke 메서드를 호출합니다.
Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _ New Object() {1, "This is the string"})
Label1.BeginInvoke(new myDelegate(myMethod), new Object[] {1, "This is the string"});
참고 항목
작업
연습: Visual Basic으로 간단한 다중 스레드 구성 요소 만들기
연습: Visual C#으로 간단한 다중 스레드 구성 요소 만들기