AsyncOperation.Post(SendOrPostCallback, Object) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
애플리케이션 모델에 적합한 스레드 또는 컨텍스트에서 대리자를 호출합니다.
public:
void Post(System::Threading::SendOrPostCallback ^ d, System::Object ^ arg);
public void Post(System.Threading.SendOrPostCallback d, object arg);
public void Post(System.Threading.SendOrPostCallback d, object? arg);
member this.Post : System.Threading.SendOrPostCallback * obj -> unit
Public Sub Post (d As SendOrPostCallback, arg As Object)
매개 변수
SendOrPostCallback 작업이 종료될 때 호출할 대리자를 래핑하는 개체입니다.
- arg
- Object
매개 변수에 포함된 대리자의 인수입니다 d .
예외
이 PostOperationCompleted(SendOrPostCallback, Object) 작업에 대해 이전에 메서드가 호출되었습니다.
d은 null입니다.
예제
다음 코드 예제에서는 비동기 작업의 진행률 및 증분 결과를 보고하는 메서드를 사용하는 Post 방법을 보여 줍니다. 이 코드 예제는 클래스에 제공된 더 큰 예제의 System.ComponentModel.AsyncOperationManager 일부입니다.
// This method computes the list of prime numbers used by the
// IsPrime method.
ArrayList BuildPrimeNumberList(
int numberToTest,
AsyncOperation asyncOp)
{
ArrayList primes = [];
int n = 5;
// Add the first prime numbers.
_ = primes.Add(2);
_ = primes.Add(3);
// Do the work.
while (n < numberToTest &&
!TaskCanceled(asyncOp.UserSuppliedState))
{
if (IsPrime(primes, n, out int firstDivisor))
{
// Report to the client that a prime was found.
ProgressChangedEventArgs e = new CalculatePrimeProgressChangedEventArgs(
n,
(int)(n / (float)numberToTest * 100),
asyncOp.UserSuppliedState);
asyncOp.Post(onProgressReportDelegate, e);
_ = primes.Add(n);
// Yield the rest of this time slice.
Thread.Sleep(0);
}
// Skip even numbers.
n += 2;
}
return primes;
}
' This method computes the list of prime numbers used by the
' IsPrime method.
Private Function BuildPrimeNumberList( _
ByVal numberToTest As Integer, _
ByVal asyncOp As AsyncOperation) As ArrayList
Dim e As ProgressChangedEventArgs = Nothing
Dim primes As New ArrayList
Dim firstDivisor As Integer
Dim n As Integer = 5
' Add the first prime numbers.
primes.Add(2)
primes.Add(3)
' Do the work.
While n < numberToTest And _
Not Me.TaskCanceled(asyncOp.UserSuppliedState)
If IsPrime(primes, n, firstDivisor) Then
' Report to the client that you found a prime.
e = New CalculatePrimeProgressChangedEventArgs( _
n, _
CSng(n) / CSng(numberToTest) * 100, _
asyncOp.UserSuppliedState)
asyncOp.Post(Me.onProgressReportDelegate, e)
primes.Add(n)
' Yield the rest of this time slice.
Thread.Sleep(0)
End If
' Skip even numbers.
n += 2
End While
Return primes
End Function
설명
메서드는 Post 비동기 작업의 수명을 종료하지 않고 매개 변수에 지정된 arg 대리자를 호출합니다.
비동기 작업의 수명이 호출로 종료되지 않은 동안 원하는 만큼 메서드를 자주 호출 Post 할 수 있습니다 PostOperationCompleted. 이 메서드를 사용하여 진행률 또는 중간 결과를 클라이언트에 다시 보고할 수 있습니다.
매개 변수는 d 비동기 작업의 상태에 대한 업데이트를 게시할 때 호출하려는 대리자를 래핑합니다. 개체는 AsyncOperation 애플리케이션 모델에 적합한 스레드 또는 컨텍스트에서 대리자가 호출되도록 합니다. 필요에 따라 메서드는 상태 변경, 진행률 업데이트 또는 새로 사용 가능한 증분 결과를 클라이언트에 알립니다.
매개 변수를 arg 사용하여 매개 변수로 래핑된 d 대리자의 상태를 전달해야 합니다. 개체에 대한 참조 AsyncOperation일 수도 있고 개체일 System.ComponentModel.ProgressChangedEventArgs 수도 있습니다. 추가 상태 스토리지를 제공하기 위해 사용자 고유의 System.ComponentModel.ProgressChangedEventArgs 클래스를 파생하는 것이 좋습니다.
상속자 참고
상속자는 호출을 비동기식으로 설정 Post(SendOrPostCallback, Object) 해야 하므로 클래스 라이브러리 공급자는 비동기라고 가정하지만 특정 애플리케이션 모델이 동기적일 경우 잠재적인 스택 오버플로를 염려할 필요가 없습니다.
참고: 콘솔 애플리케이션은 호출 실행을 Post(SendOrPostCallback, Object) 동기화하지 않습니다. 이로 인해 ProgressChanged 이벤트가 순서대로 발생하지 않을 수 있습니다. 호출을 직렬 실행하려면 Post(SendOrPostCallback, Object), SynchronizationContext 클래스를 구현하고 설치합니다.
비동기 클래스 구현에 대한 자세한 내용은 이벤트 기반 비동기 패턴 구현을 참조하세요.
적용 대상
추가 정보
- AsyncOperationManager
- 관리되는 스레딩 모범 사례