AsyncOperation.Post Method

Invokes a delegate on the thread or context appropriate for the application model.

Namespace:  System.ComponentModel
Assembly:  System (in System.dll)

public void Post(
	SendOrPostCallback d,
	Object arg


Type: System.Threading.SendOrPostCallback
A SendOrPostCallback object that wraps the delegate to be called when the operation ends.
Type: System.Object
An argument for the delegate that is contained in the d parameter.


The PostOperationCompleted method has been called previously for this task.


d is null.

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 Inheritors

Inheritors 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.


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 SendOrPostCallback AsyncOpProgressReportHandler;
private SendOrPostCallback AsyncOpCompletedHandler;

// Constructor
public PersonDataSource()
    // Attach the Completed and ProgressChanged events that 
    // will be called by AsyncOperation to their delegates.
    AsyncOpProgressReportHandler =
        new SendOrPostCallback(AsyncOpGetPersonsProgressChanged);
    AsyncOpCompletedHandler =
        new SendOrPostCallback(AsyncOpGetPersonsCompleted);

// ProgressChanged method for passing in to the 
// AsyncOperation Post method.
protected void AsyncOpGetPersonsProgressChanged(object state)
    GetPersonsProgressChangedEventArgs e
        = state as GetPersonsProgressChangedEventArgs;

// Completed-event method for passing in to the 
// AsyncOperation PostOperationCompleted method.
protected void AsyncOpGetPersonsCompleted(object eventArgs)
    GetPersonsCompletedEventArgs e =
        eventArgs as GetPersonsCompletedEventArgs;

// Raise the ProgressChanged event.
protected void OnGetPersonsProgressChanged
    (GetPersonsProgressChangedEventArgs e)
    if (GetPersonsProgressChangedEvent != null)

// Raise the Completed event.
protected void OnGetPersonsCompleted
    (GetPersonsCompletedEventArgs e)
    if (GetPersonsCompletedEvent != null)
        GetPersonsCompletedEvent(this, e);

// Report progress by using AsyncOperation to raise
// the ProgressChanged event.
int percentComplete = 0;
    percentComplete =
        Convert.ToInt32(i * 100 / itemsCount);
catch (Exception ex)
    exception = ex;

GetPersonsProgressChangedEventArgs progressChangedEventArgs =
    new GetPersonsProgressChangedEventArgs(

if (GetPersonsCheckForCancellation
    canceled = true;


Supported in: 5, 4, 3

Silverlight for Windows Phone

Supported in: Windows Phone OS 7.1, Windows Phone OS 7.0

XNA Framework

Supported in: Xbox 360, Windows Phone OS 7.0

For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.

Community Additions