Я начал использовать механизм wait/async в нашем.Net приложении WPF.
В моей модели ViewModel я вызываю метод async для службы.
Мой вопрос: лучше ли
- Непосредственно внутри этой службы сделайте одно большое
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) мы будем использовать меньшую задачу, это, вероятно, наиболее эффективно (???)
- В 2) Это кажется более "совместимым" с подходом асинхронного ожидания, это позволит изменить видимость некоторых методов и все еще быть асинхронным, это позволит параллельным методам запуска, если потребуется, в один прекрасный день.