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

Want to get my personal insights on what I learn as I learn it? Subscribe now!


/