Visual C# 메서드를 비동기적으로 호출하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 315582 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

Microsoft .NET Framework 쉽게 함수를 비동기적으로 호출할 수 있습니다. 함수를 비동기적으로 호출하는 호출 함수를 계속 다른 작업을 수행하는 동안 보조 스레드에서 백그라운드로 실행할 시스템이 중지됩니다. 일반적인 (동기) 함수 호출에서 함수는 즉시 호출이 동일한 스레드에서가 실행됩니다. 호출 함수 호출을 완료할 때까지 기다린 후 계속하기 전에 호출의 결과를 받습니다. 반대로, 비동기 호출을 수행할 때 나중에 비동기 호출의 결과를 검색합니다. 이 문서에서는 Visual C# 를 사용하여 이 작업을 수행하는 방법을 보여 줍니다.

요구 사항


다음은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩의 목록입니다.
  • Microsoft Windows 2000 또는 Microsoft Windows XP 또는 Microsoft Windows Server 2003
  • Visual Studio .NET 또는 Visual Studio 2005
이 문서에서는 사용자가 다음 항목을 잘 알고 있다고 가정합니다.
  • Visual C# 에서는 메서드 호출
  • 대리자를 사용하는 방법

비동기 호출을 만들기 방법

대리자를 사용하여 비동기 호출이 이루어집니다. 대리자를 함수 래핑하는 개체입니다. 대리자를 동기식 함수를 제공하며 또한 래핑된 함수를 비동기적으로 호출하는 메서드를 제공합니다. 이러한 메서드를 BeginInvoke()EndInvoke() 있습니다. 이러한 메서드의 매개 변수 목록을 대리자를 래핑합니다 함수 서명을 따라 다릅니다. 참고 Visual Studio .NET IntelliSense 기능을 BeginInvoke()EndInvoke() 표시할 입력할 때 이를 나타나는 볼 함수를 나열합니다.

BeginInvoke() 비동기 호출을 시작하는 데 사용됩니다. 래핑된 함수로 동일한 매개 변수를 더한 이 문서의 뒷부분에서 설명하는 두 개의 추가 매개 변수가 있습니다. BeginInvoke() 즉시 반환하고 비동기 호출이 완료될 때까지 기다리지 않습니다. BeginInvoke()IAsyncResult 개체를 반환합니다.

EndInvoke() 함수는 비동기 호출의 결과를 검색하는 데 사용됩니다. 언제든지 BeginInvoke() 후 호출할 수 있습니다. 완료될 때까지 비동기 호출이 아직 EndInvoke() 블록 완료되지 않은 경우. EndInvoke() 함수의 매개 변수가 out 및 래핑된 함수에 있는, ref 매개 변수를 BeginInvoke()에 의해 반환된 IAsyncResult 개체가 포함됩니다.

다음 대리자 및 BeginInvoke()EndInvoke() 메서드에 예입니다:
// The following delegate 
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;

// will have the following BeginInvoke() and EndInvoke methods:
IAsyncResult MethodDelegate.BeginInvoke(int iCallTime, out int iExecThread, AsyncCallback cb, object AsyncState); 

string MethodDelegate.EndInvoke (out int iExecThread, IAsyncResult ar) ;
				
수 있는 일반적인 네 가지 BeginInvoke()EndInvoke() 비동기 호출을 수행할 수 있습니다. BeginInvoke() 호출하면 다음과 같은 작업을 수행할 수 있습니다.
  • 필요에 따라 다른 작업을 수행할 및 EndInvoke() 사용하십시오.
  • IAsyncResult 개체에서 제공하는 WaitHandle 구하여 WaitOne 메서드를 사용하여 WaitHandle 신호를 받을 때까지 차단 EndInvoke() 호출하십시오.
  • 비동기 호출이 완료될 때 확인하고 EndInvoke() 호출하여 IAsyncResult 개체를 폴링할.
  • 지정한 콜백 함수를 호출하여 시스템이 있습니다. 이 콜백 함수는 EndInvoke() 호출하고 완료될 때 비동기 호출의 결과를 처리합니다.
다음 코드 예제에서는 이러한 패턴을 호출하고 다음 함수를 사용하여 동기 호출을 만드는 함께 대비 보여 주는:
string LongRunningMethod (int iCallTime, out int iExecThread)
{
	Thread.Sleep (iCallTime) ;
	iExecThread = AppDomain.GetCurrentThreadId ();
	return "MyCallTime was " + iCallTime.ToString() ;
}

				
LongRunningMethod() 절전 모드에 의해 오랫동안 실행되는 함수를 시뮬레이션합니다. 절전 시간과 실행하는 스레드의 ID를 반환합니다. 비동기적으로 호출하는 경우 실행 중인 스레드의 스레드 ID 호출 스레드의 다릅니다 것을 찾습니다.

첫 번째 단계는 함수를 래핑하는 대리자에 정의하는 것입니다:
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;
				

예제 1: 동기적으로 A 메서드 호출

이 샘플은 LongRunningMethod()MethodDelegate 대리자를 사용하여 동기적으로 호출하는 방법을 보여 줍니다. 다른 샘플 호출을 비동기적으로 만드는 대조합니다.
  1. Microsoft Visual Studio .NET 또는 Microsoft Visual Studio 2005 시작하십시오.
  2. AsyncDemo 라는 새 Visual C# 콘솔 응용 프로그램 프로젝트를 만듭니다.
  3. 다음과 같이 새 .cs 파일 프로젝트에 정의된 AsyncDemo 라는 클래스를 추가:
    using System;
    using System.Threading ; 
    using System.Windows.Forms ;
    
    public class AsyncDemo
    {
    	string LongRunningMethod (int iCallTime, out int iExecThread)
    	{
    		Thread.Sleep (iCallTime) ;
    		iExecThread = AppDomain.GetCurrentThreadId ();
    		return "MyCallTime was " + iCallTime.ToString() ;
    	}
    
    	delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;
    
    	public void DemoSyncCall()
    	{
    		string s ;
    		int iExecThread;
    
    		// Create an instance of a delegate that wraps LongRunningMethod.
    		MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;  
    			
    		// Call LongRunningMethod using the delegate.
    		s = dlgt(3000, out iExecThread);  
    			
    		MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                            and the thread ID {1}", s, iExecThread.ToString() ) );
    	}
    }
    					
    나중에, 이 클래스는 비동기 호출을 만드는 방법을 보여 줍니다. 그러나 처음에는 하나만 동기적으로 대리자를 호출하는 방법을 보여 줍니다 DemoSyncCall() 메서드를 포함합니다.
  4. Visual Studio 프로젝트에 자동으로 만듭니다 Main 함수 본문에 다음 코드를 추가하여:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoSyncCall() ;
    }
    					
  5. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다.

EndInvoke() 호출 패턴을 사용하여 A 메서드 예제 2: 비동기적으로 호출

이 단원의 샘플에서는 동일한 메서드를 비동기적으로 호출합니다. 사용되는 호출 패턴 BeginInvoke 호출하려면, 몇 주 스레드에서 작업을 수행하고 EndInvoke() 호출하여. 비동기 호출이 완료될 때까지 EndInvoke() 반환하지 않도록 주의하십시오. 이 호출 패턴 유용합니다 호출 스레드가 있어야 할 비동기 호출을 실행하는 동시에 작업을 수행합니다. 동시에 발생하는 작업 문제가 많은 응용 프로그램의 성능을 향상시킬 수 있습니다. 이 방법으로 비동기적으로 실행되도록 일반적인 작업 파일 또는 네트워크 작업입니다.
  1. DemoEndInvoke()AsyncDemo 클래스의 명명된 메서드를 추가하십시오. DemoEndInvoke 함수에 대리자를 비동기적으로 호출하는 방법을 보여 줍니다.
    public void DemoEndInvoke()
    {
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    	string s ;
    	int iExecThread;
    
    	// Initiate the asynchronous call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null);  
    
    	// Do some useful work here. This would be work you want to have
    	// run at the same time as the asynchronous call.
    
    	// Retrieve the results of the asynchronous call.
    	s = dlgt.EndInvoke (out iExecThread, ar) ;  
    
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                   and the number {1}", s, iExecThread.ToString() ) );
    }
    					
  2. 다음 코드에서는 포함되도록에 대한 소스 코드를 편집할:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoEndInvoke() ;
    }
    					
  3. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다.

예제 3: 비동기적으로 A 메서드 호출 및 해당 호출 대기 받는 A WaitHandle 완료 대상 사용


이 단원의 샘플에서는 메서드를 비동기적으로 호출합니다 후 EndInvoke() 호출하기 전에 대한 WaitHandle 기다립니다. BeginInvoke()에 의해 반환된 IAsyncResultAsyncWaitHandle 속성이 있습니다. 이 속성은 비동기 호출이 완료될 때 신호를 받는 WaitHandle 반환합니다. WaitHandle 따라 대기 중인 일반적인 스레드 동기화 기술입니다. 호출 스레드를 WaitHandleWaitOne() 메서드를 사용하여 모음의 WaitHandle 기다립니다. WaitOne()WaitHandle 신호를 받을 때까지 차단됩니다. WaitOne() 반환될 때 EndInvoke() 호출하기 전에 몇 가지 추가 작업을 수행할 수 있습니다. 이전 샘플에서는 같이 이 방법은 그렇지 않은 호출 주 스레드를 차단하는 파일 또는 네트워크 작업을 실행하는 데 유용합니다.
  1. DemoWaitHandle()AsyncDemo 클래스 라는 함수에 추가하십시오. DemoWaitHandle() 함수에 대리자를 비동기적으로 호출하는 방법을 보여 줍니다.
    public void DemoWaitHandle ()
    {
    	string s ;
    	int iExecThread;
    
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    
    	// Initiate the asynchronous call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null); 
    
    	// Do some useful work here. This would be work you want to have
    	// run at the same time as the asynchronous call.
    
    	// Wait for the WaitHandle to become signaled.
    	ar.AsyncWaitHandle.WaitOne() ;
    
    	// Get the results of the asynchronous call.
    	s = dlgt.EndInvoke (out iExecThread, ar) ;
    			
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                     and the number {1}", s, iExecThread.ToString() ) );
    }
    					
  2. 다음 코드에서는 포함되도록에 대한 소스 코드를 편집할:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoWaitHandle () ;
    }
    					
  3. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다.

폴링 호출 패턴을 사용하여 A 메서드 예제 4: 비동기적으로 호출

이 섹션에서는 샘플에서는 비동기 호출이 완료되면 알아보려면 IAsyncResult 개체를 폴링합니다. BeginInvoke()에 의해 반환된 IAsyncResult 개체를 비동기 호출이 완료되면 True 를 반환합니다, IsCompleted 속성이 있습니다. 그런 다음 EndInvoke()를 호출할 수 있습니다. 이 호출 패턴 응용 프로그램의 실행 시간이 긴 함수 호출에 의해 차단되는 않으려는 진행 중인 작업을 수행하는 경우 유용합니다. Microsoft Windows 응용 프로그램을 예로 들 것입니다. Windows 응용 프로그램의 주 스레드는 계속 비동기 호출을 실행하는 동안 사용자 입력을 처리할 수 있습니다. 호출이 완료되었는지 확인하기 위해 IsCompleted 이를 정기적으로 확인할 수 있습니다. IsCompletedTrue 반환될 때 EndInvoke를 호출합니다. 비동기 작업이 완료될 때까지 EndInvoke() 차단하기 때문에 작업이 완료되었는지 알아야 응용 프로그램이 이를 호출하지 않습니다.
  1. DemoPolling()AsyncDemo 클래스 라는 함수에 추가하십시오. DemoPolling() 함수에 대리자를 비동기적으로 호출하고 폴링 프로세스가 완료된 경우 볼 수 방법을 보여 줍니다.
    public void DemoPolling()
    {
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    	string s ;
    	int iExecThread;
    
    	// Initiate the asynchronous call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null); 
    
    	// Poll IAsyncResult.IsCompleted
    	while(ar.IsCompleted == false)
    	{
    		Thread.Sleep (10) ;  // pretend to so some useful work
    	}
    	s = dlgt.EndInvoke (out iExecThread, ar) ;
    
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                    and the number {1}", s, iExecThread.ToString() ) );
    }
    
    					
  2. 소스 코드에 대한 Main 편집하십시오. 함수의 내용을 다음 코드로 바꿉니다:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoPolling () ;
    }
    					
  3. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다.

예제 5: 한 콜백 비동기 메서드 완료 시 실행

이 섹션에서는 비동기 호출이 완료될 때 시스템에서 실행되는 BeginInvoke() 함수에 콜백 대리자를 샘플을 제공합니다. 콜백을 EndInvoke() 호출하고 비동기 호출의 결과를 처리합니다. 이 호출 패턴 비동기 호출을 시작하는 스레드가 호출 결과를 처리할 하는 경우 유용합니다. 비동기 호출이 완료될 때 시스템을 시작하는 스레드 이외의 스레드에서 콜백을 호출합니다.

이 호출 패턴을 사용하려면 AsyncCallback 형식의 대리자를 BeginInvoke() 함수의 마지막 두 번째 매개 변수로 전달해야 합니다. 모든 개체를 전달할 수 있는 개체 입력합니다 최종 매개 BeginInvoke() 수도 있습니다. 호출될 때 이 개체를 사용하여 콜백 함수를 사용할 수 있습니다. 한 가지 중요한 이 매개 변수는 호출을 시작하는 데 사용되는 대리자를 전달하는 데 사용합니다. 다음 콜백 함수가 해당 대리자의 EndInvoke() 함수 호출을 완료할 수 있습니다. 이 호출 패턴 아래에 나와 있습니다.
  1. DemoCallback()MyAsyncCallback()AsyncDemo 클래스 라는 두 개의 메서드를 추가하십시오. DemoCallback() 메서드는 대리자를 비동기적으로 호출하는 방법을 보여 줍니다. 비동기 작업이 완료될 때 시스템에서 MyAsyncCallback() 메서드를 래핑하는 데 대리자를 사용합니다. MyAsyncCallback()EndInvoke()를 호출합니다.
    public void DemoCallback()
    {
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    	string s ;
    	int iExecThread;
    
    	// Create the callback delegate.
    	AsyncCallback cb = new AsyncCallback(MyAsyncCallback);
    
    	// Initiate the Asynchronous call passing in the callback delegate
    	// and the delegate object used to initiate the call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, cb, dlgt); 
    }
    
    public void MyAsyncCallback(IAsyncResult ar)
    {
    	string s ;
    	int iExecThread ;
    
    	// Because you passed your original delegate in the asyncState parameter
    	// of the Begin call, you can get it back here to complete the call.
    	MethodDelegate dlgt = (MethodDelegate) ar.AsyncState;
    
    	// Complete the call.
    	s = dlgt.EndInvoke (out iExecThread, ar) ;
    
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                    and the number {1}", s, iExecThread.ToString() ) );
    }
    
    					
  2. 소스 코드에 대한 Main 편집하십시오. 함수의 내용을 다음 코드로 바꿉니다:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoCallback() ;
    }
    					
  3. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다.

속성

기술 자료: 315582 - 마지막 검토: 2006년 12월 11일 월요일 - 수정: 4.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
키워드:?
kbmt kbhowtomaster KB315582 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com