Best practices to use await-async, where to start the task? : <p>I started to use the await/async mechanism in our .Net WPF application.</p>

<p>In my ViewModel, I'm calling an async method on a service.</p>

<p>My question is:
Is it better to </p>

<ol>
<li>Directly inside this service, make one big <code>return await Task.Run(()=&gt;{...});</code></li>
<li>Have all the submethods on this service being also async and then inside this have the <code>Task.Run</code>?</li>
</ol>

<p>By example:</p>

<p>1)</p>

<pre><code>public class Service:IService{
    public async Task&lt;SomeResult&gt;(SomeParameter parameter){
        return await Task.Run(()=&gt;{
            CopyStuff(parameter.A);
            UpgradeStuff(parameter.B);
            return ReloadStuff(parameter.C)
        });
    }

    private void CopyStuff(ParamA parameter){
        ...//Some long operation that will mainly wait on the disk

    }
    private void UpgradeStuff(ParamB parameter){
        ...//Some long operation that should not block the GUI thread
    }
    public SomeResult ReloadStuff(ParamC parameter){
        return ...;//Some long operation that relaunch some services and return their successs      
    }   
}
</code></pre>

<p>2)</p>

<pre><code>public class Service:IService{
    public async Task&lt;SomeResult&gt;(SomeParameter parameter){
        await CopyStuff(parameter.A);
        await UpgradeStuff(parameter.B);
        return await ReloadStuff(parameter.C)       
    }

    private async Task CopyStuff(ParamA parameter){
        return await Task.Run(()=&gt;{...});//Some long operation that will mainly wait on the disk
    }
    private async Task UpgradeStuff(ParamB parameter){
        return await Task.Run(()=&gt;{...});//Some long operation that should not block the GUI thread
    }
    public async Task&lt;SomeResult&gt; ReloadStuff(ParamC parameter){
        return await Task.Run(()=&gt;{return ...});//Some long operation that relaunch some services and return their successs 
    }   
}
</code></pre>

<p>I can see advantages in both approaches:</p>

<ul>
<li>In 1) we will use less task, this is probably most efficient(???)</li>
<li>In 2) This feel more "compliant" with the async-await approach, this would allow to change the visibility of some methods and still being async, this would allow the methods to run in parallel if required one day.</li>
</ul>
