Mark Pearl

I am really enjoying getting more and more into the new async ctp. Something that stumped me up to now, was how do I run a void method asynchronously.

For instance, suppose I have the following workflow that I want to run.

    private void DoWorkFlowSync()
    {
        txtStatus.Text = "Step 1";
        Step1Workflow();
        txtStatus.Text = "Step 2";
        Step2Workflow();
        txtStatus.Text = "Step 3";
        Step3Workflow();
        txtStatus.Text = "Done";
    }
    
    private void Step1Workflow()
    {            
        Thread.Sleep(1000);             
    }

    private void Step2Workflow()
    {
        Thread.Sleep(1000);            
    }

    private void Step3Workflow()
    {
        Thread.Sleep(1000);            
    }

This is it in its synchronous state, if I try and run it asynchronously my initial attempts would be to code the DoWorkFlowSync as follows.

    private async void DoWorkFlowAsync()
    {
        txtStatus.Text = "Step 1";
        await Step1Workflow();
        txtStatus.Text = "Step 2";
        await Step2Workflow();
        txtStatus.Text = "Step 3";
        await Step3Workflow();
        txtStatus.Text = "Done";
    } To which the compiler would respond with a compile time error with the following…

Error 1 Cannot await ‘void’

So, a bit of a dilemma. I don’t want to have to rewrite each individual method (i.e. Step1Wroflow) to be of type Task. It would be doable if this was a small project but I want to be able to refactor large projects with appropriate asynchronous calls without going to deep into the project. Eventually I made a mind shift and found the following to work.

    private async void DoWorkFlowAsync()
    {
        txtStatus.Text = "Step 1";
        await TaskEx.Run(() => Step1Workflow());
        txtStatus.Text = "Step 2";
        await TaskEx.Run(() => Step2Workflow());
        txtStatus.Text = "Step 3";
        await TaskEx.Run(() => Step3Workflow());
        txtStatus.Text = "Done";
    } This worked perfectly, the UI was responsive and I have a workflow that is easy to read.

For those that are interested in learning more about the new async ctp go to the forum



blog comments powered by Disqus