私は、.NET WPFアプリケーションでawait/asyncメカニズムを使い始めました。await-asyncを使用するためのベストプラクティス、タスクを開始する場所
私のViewModelでは、サービス上で非同期メソッドを呼び出しています。
私の質問は次のとおりです。 は、それが本サービス内に直接
- する方がよい、一つの大きな
return await Task.Run(()=>{...});
- は、このサービスはまた、非同期であることに、すべてのサブメソッドを持っているし、この内
Task.Run
があることを確認してください?1)
public class Service:IService{ public async Task<SomeResult>(SomeParameter parameter){ return await Task.Run(()=>{ 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 } }
2)私は両方のアプローチにおいて利点を見ることができる
public class Service:IService{ public async Task<SomeResult>(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(()=>{...});//Some long operation that will mainly wait on the disk } private async Task UpgradeStuff(ParamB parameter){ return await Task.Run(()=>{...});//Some long operation that should not block the GUI thread } public async Task<SomeResult> ReloadStuff(ParamC parameter){ return await Task.Run(()=>{return ...});//Some long operation that relaunch some services and return their successs } }
:例によって
1において
- )を我々は意志より少ないタスクを使用する
- In 2)これは、非同期待ちのアプローチでより「準拠している」と感じています。これにより、一部のメソッドの可視性を変更でき、それでも非同期であることが可能になります。これにより、メソッドいつでも必要に応じて並行して実行できます。
あなたの場合は、UIを応答性にするために 'Task.Run'を使用する必要がありますか?サービスクラスは通常の同期クラスであり、できるだけUIの近くに 'Task.Run'を一度呼び出すことをお勧めします。たとえば、MVVMコマンドハンドラで指定します。 –
ちょうど私の2セントです.2番目のアプローチでは、同期コンテキストを気にしない場合は、 'await'呼び出しごとに' ConfigureAwait(false) 'を使うのを忘れないでください。これは、実行時に毎回コンテキストを切り替えることがないため、小さなパフォーマンス向上をもたらします(特に、多くの 'await'が順番に呼び出される場合)。 – dymanoid
@ YacoubMassadはい、このサービスを使用するたびに、新しいタスクを宣言する必要があり、他のタスクと並行して実行することはできません。 – J4N