AsyncOperation.Post Method
[ This article is for Windows Phone 8 developers. If you’re developing for Windows 10, see the latest documentation. ]
Invokes a delegate on the thread or context appropriate for the application model.
Assembly: System (in System.dll)
Parameters
- d
- Type: System.Threading.SendOrPostCallback
A SendOrPostCallback object that wraps the delegate to be called when the operation ends.
- arg
- Type: System.Object
An argument for the delegate that is contained in the d parameter.
| Exception | Condition |
|---|---|
| InvalidOperationException | The PostOperationCompleted method has been called previously for this task. |
| ArgumentNullException | d is Nothing. |
The Post method invokes the delegate specified by the arg parameter without ending the lifetime of the asynchronous operation.
You can call the Post method as often as you like as long as the lifetime of the asynchronous operation has not been ended by a call to PostOperationCompleted. You can use the method to report progress or interim results back to clients.
The d parameter wraps the delegate you want called when you want to post an update about the status of the asynchronous task. The AsyncOperation object will make sure that your delegate is invoked on the thread or context appropriate for the application model. Your method can optionally raise an event that notifies clients of a status change, progress update, or newly available incremental results.
The arg parameter should be used to pass state to the delegate wrapped by the d parameter. It might be a reference to an AsyncOperation, or it might be a System.ComponentModel.ProgressChangedEventArgs object. It may be desirable to derive your own class from System.ComponentModel.ProgressChangedEventArgs to provide additional state storage.
Notes to InheritorsInheritors must make the Post invocation asynchronous, so that class library providers do not need to concern themselves with potential stack overflows if they assume asynchrony but a particular application model happens to be synchronous.
Note: |
|---|
Console applications do not synchronize the execution of Post calls. This can cause ProgressChanged events to be raised out of order. If you want to have serialized execution of Post calls, implement and install a System.Threading.SynchronizationContext class. |
For more information about how to implement asynchronous classes, see Implementing the Event-based Asynchronous Pattern in the .NET Framework documentation.
The following code example demonstrates how to use the Post method for reporting progress and incremental results of an asynchronous operation. This code example is part of a larger example provided for the System.ComponentModel.AsyncOperationManager class.
' The GetPersons method will raise ProgressChanged and ' Completed events by using AsyncOperation's Post ' and PostOperationCompleted methods. Declare delegates ' for them here. Methods for use ' with these delegates will be defined below. Private AsyncOpProgressReportHandler As SendOrPostCallback Private AsyncOpCompletedHandler As SendOrPostCallback ' Constructor Public Sub New() ' Attach the Completed and ProgressChanged methods that will ' be called by AsyncOperation to their delegates. AsyncOpProgressReportHandler = New SendOrPostCallback _ (AddressOf AsyncOpGetPersonsProgressChanged) AsyncOpCompletedHandler = New SendOrPostCallback _ (AddressOf AsyncOpGetPersonsCompleted) End Sub ' ProgressChanged method for passing in to the ' AsyncOperation Post method. Protected Sub AsyncOpGetPersonsProgressChanged(ByVal state As Object) Dim progressChangedEventArgs As GetPersonsProgressChangedEventArgs _ = TryCast(state, GetPersonsProgressChangedEventArgs) OnGetPersonsProgressChanged(progressChangedEventArgs) End Sub ' Completed-event method for passing in to the ' AsyncOperation PostOperationCompleted method. Protected Sub AsyncOpGetPersonsCompleted(ByVal eventArgs As Object) Dim completedEventArgs As GetPersonsCompletedEventArgs _ = TryCast(eventArgs, GetPersonsCompletedEventArgs) OnGetPersonsCompleted(completedEventArgs) End Sub ' Raise the ProgressChanged event. Protected Sub OnGetPersonsProgressChanged _ (ByVal e As GetPersonsProgressChangedEventArgs) RaiseEvent GetPersonsProgressChangedEvent(e) End Sub ' Raise the Completed event. Protected Sub OnGetPersonsCompleted _ (ByVal e As GetPersonsCompletedEventArgs) RaiseEvent GetPersonsCompletedEvent(Me, e) End Sub
' Report progress by using AsyncOperation to raise ' the ProgressChanged event. Pass in itemsCount of ' zero to see effect of catching an exception. Dim percentComplete As Integer Try percentComplete = Convert.ToInt32(i * 100 / itemsCount) Catch ex As Exception exception = ex Exit While End Try Dim progressChangedEventArgs As _ New GetPersonsProgressChangedEventArgs _ (currentName, _ percentComplete, _ asyncOperation.UserSuppliedState) asyncOperation.Post _ (AsyncOpProgressReportHandler, progressChangedEventArgs) If GetPersonsCheckForCancellation _ (asyncOperation.UserSuppliedState) Then canceled = True Exit While End If
Note: