使用する際の正しいアーキテクチャーについて、ご意見をお聞かせくださいTask.Run
。WPF .NET 4.5アプリケーション(Caliburn Microフレームワークを使用)でUIが遅くなっています。
基本的に私はやっています(非常に単純化されたコードスニペット):
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();
}
}
私が読んだり見たりした記事/ビデオから、それawait
async
が必ずしもバックグラウンドスレッドで実行されているわけではなく、バックグラウンドで作業を開始するには、awaitでラップする必要がありますTask.Run(async () => ... )
。を使用async
await
してもUIはブロックされませんが、UIスレッドで実行されているため、遅延が発生します。
Task.Runを配置するのに最適な場所はどこですか?
私はちょうどいいですか
これは.NETのスレッド処理が少ないため、外部呼び出しをラップします。
、または
Task.Run
他の場所で再利用できるようにするため、内部で実行されているCPUバインドメソッドのみをラップする必要がありますか?コアの深いバックグラウンドスレッドで作業を開始することが良いアイデアかどうか、ここではわかりません。
広告(1)、最初のソリューションは次のようになります:
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.
広告(2)、2番目のソリューションは次のようになります。
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());
は単にである必要がありますawait Task.Run( () => this.contentLoader.LoadContentAsync() );
。私の知る限り、あなたは秒await
とasync
内側を追加することによって何も得ませんTask.Run
。また、パラメータを渡していないので、これによりがさらに単純化されawait Task.Run( this.contentLoader.LoadContentAsync );
ます。