Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Asynchronous method using C#: Part II

0.00/5 (No votes)
21 Apr 2012 2  
How to report progress and intermediate results from an asynchronous process to client code.

Sample Image

Introduction

In this article, we demonstrate how to report progress information and intermediate results from an asynchronous method. This article builds on the previous article, Asynchronous method using C#: Part I.

Using the code

In this article, we do the following changes to our previous example:

  • Modify the Perform method for reporting progress.

  • Implement the ProgressChanged event.

  • Define the method ReportProgrss that synchronizes the Perform method and the ProgressChanged event.

The Perform method

Here is the Perform method that we define in our previous example.

private void Perform(string[] files)
{
    foreach (string file in files)
    {
        //do something......
        Thread.Sleep(100);
    }
}

Now we modify it in such a way that it reports the progress of the task to the client code and the processed files.

private void Perform(string[] files)
{
    int counter = 0;
    foreach (string file in files)
    {
        //do something......
        Thread.Sleep(100);

        counter++;
        //compute progress
        int percentage = (100 * counter) / files.Length;
        //raises progresschanged event
        ReportProgress(percentage, file);
    }
}

After processing the file, we compute the percentage in percentage and pass it as an argument in the ReportProgress() method, which is an example of how to pass intermediate results to the client code.

Implement the ProgressChanged event

This event is raised whenever an asynchronous method wants to report progress to client code.

public event ProgressChangedEventHandler ProgressChanged
{
    add
    {
        this.progressChangedEventHandler += value;
    }
    remove
    {
        this.progressChangedEventHandler -= value;
    }
}
private ProgressChangedEventHandler progressChangedEventHandler;

protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
{
    if (progressChangedEventHandler != null)
        progressChangedEventHandler(this, e);
}

Handling the ProcessChanged event in client code

Register and implement a handler of the ProgressChanged event.

t.ProgressChanged += new ProgressChangedEventHandler(task_ProgressChange);

static void task_ProgressChange(object sender, ProgressChangedEventArgs e)
{
    Console.WriteLine("[Task] Progress: {0} %, Current File: {1}", 
                      e.ProgressPercentage, e.UserState);
}

The ReportProgress method

This method calls the ProgressChanged event through an AsyncOperation object.

void ReportProgress(int percentProgress, object userState)
{
    // FIXME: verify the expected behavior
    if (!IsBusy)
        return;

    async.Post(delegate(object o)
    {
        ProgressChangedEventArgs e = o as ProgressChangedEventArgs;
        OnProgressChanged(e);
    },
        new ProgressChangedEventArgs(percentProgress, userState));
}

In this series:

  1. Asynchronous method using C#: Part I.

  2. Asynchronous method using C#: Part II.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here