Size ne zaman kullanacağınız konusunda doğru mimari hakkındaki fikrinizi sormak istiyorum Task.Run
. WPF .NET 4.5 uygulamamızda (Caliburn Micro framework ile) tembel kullanıcı arayüzü yaşıyorum.
Temelde (çok basitleştirilmiş kod parçacıkları) yapıyorum:
public class PageViewModel : IHandle<SomeMessage>
{
...
public async void Handle(SomeMessage message)
{
ShowLoadingAnimation();
// Makes UI very laggy, but still not dead
await this.contentLoader.LoadContentAsync();
HideLoadingAnimation();
}
}
public class ContentLoader
{
public async Task LoadContentAsync()
{
await DoCpuBoundWorkAsync();
await DoIoBoundWorkAsync();
await DoCpuBoundWorkAsync();
// I am not really sure what all I can consider as CPU bound as slowing down the UI
await DoSomeOtherWorkAsync();
}
}
Okuduğum / gördüğüm makalelerden / videolardan await
async
, bunun bir arka plan iş parçacığında çalışmadığını ve arka planda çalışmaya başlamak için beklemek zorunda kaldığınızı biliyorum Task.Run(async () => ... )
. Kullanmak async
await
UI'yi engellemez, ancak yine de UI iş parçacığında çalışıyor, bu yüzden onu laggy yapıyor.
Task.Run koymak için en iyi yer neresi?
Ben sadece
Dış çağrı sarın çünkü bu .NET için daha az iş parçacığı işi
, ya da
Task.Run
başka yerlerde yeniden kullanılabilir kıldığından, yalnızca dahili olarak çalışan CPU'ya bağlı yöntemleri kaydırmalı mıyım? Burada özde derin arka plan iş parçacıkları çalışmaya başlamak iyi bir fikir olup olmadığından emin değilim.
Reklam (1), ilk çözüm şöyle olacaktır:
public async void Handle(SomeMessage message)
{
ShowLoadingAnimation();
await Task.Run(async () => await this.contentLoader.LoadContentAsync());
HideLoadingAnimation();
}
// Other methods do not use Task.Run as everything regardless
// if I/O or CPU bound would now run in the background.
Reklam (2), ikinci çözüm şöyle olacaktır:
public async Task DoCpuBoundWorkAsync()
{
await Task.Run(() => {
// Do lot of work here
});
}
public async Task DoSomeOtherWorkAsync(
{
// I am not sure how to handle this methods -
// probably need to test one by one, if it is slowing down UI
}
await Task.Run(async () => await this.contentLoader.LoadContentAsync());
basit olmalıdırawait Task.Run( () => this.contentLoader.LoadContentAsync() );
. AFAIK, bir saniyeawait
veasync
içerisi ekleyerek hiçbir şey kazanmazsınızTask.Run
. Ve parametreleri geçmediğiniz için, bu biraz daha basitleştirirawait Task.Run( this.contentLoader.LoadContentAsync );
.