.Net WPF uygulamasındaki bekleme/uyumsuzluk mekanizmasını kullanmaya başladım.En iyi uygulamalar bekle-uyumsuzluğu, görevi başlatmak için nerede kullanılır?
ViewModel'de bir hizmette async yöntemini arıyorum.
Sorum şu: it Bu hizmetin iç Doğrudan
- mı iyidir, yapmak büyük bir
return await Task.Run(()=>{...});
- bu hizmette tüm submethods da zaman uyumsuz olması ve sonra bu
Task.Run
var içeride mı?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) her iki yaklaşım avantaj görebilir
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 } }
: örnek ile
1 de
- ) biz olacak daha az görev kullanmak Bu muhtemelen en verimli (???)
- 2) Bu, uyumsuzluk yaklaşımıyla daha "uyumlu" hisseder, bu, bazı yöntemlerin görünürlüğünü değiştirmeye ve hala uyumsuz olmasına izin verir, bu yöntemlere izin verir Bir gün gerekirse paralel olarak koşmak.
Sizin yerinizde, UI duyarlılığını yapmak için 'Task.Run' kullanmanız gerekir, değil mi? Hizmet sınıfının normal bir eşzamanlı sınıf olduğunu ve 'Task.Run' u bir kez UI'ye mümkün olduğunca yaklaştırdığınızı öneririm. Örneğin, MVVM komut işleyicilerinizde. –
Sadece iki kuruşum: ikinci yaklaşımda, senkronizasyon bağlamını önemsemiyorsanız, her 'bekle 'çağrısında' ConfigureAwait (false) 'seçeneğini kullanmayı unutmayın. Çalışma zamanı, her seferinde bağlamı değiştirmeyeceğinden, size küçük bir performans artışı verir (özellikle birçok 'bekleyiş arandığında'). – dymanoid
@YacoubMassad Evet, ancak bu hizmeti kullanacağım her seferinde yeni bir görev ilan etmek zorunda kalacağım ve başkalarının hiçbirine paralel olarak koşmayacakları anlamına geliyor, değil mi? – J4N