仕事でWPFアプリケーションの回収をしていたところなんでもシングルスレッドでやってしまっているようなコードがたくさんあり、それが原因で設計どうり動いていないコードがちらほらありました。
そこで本記事ではWPFで重い処理などを非同期処理で実装するべき理由を3つ紹介していきます。
非同期処理で実装する理由
1.画面の描画が行われない
シングルスレッドで全て実装してしまうと重たい処理が走る前に画面の表示を変更する処理をいれているにも関わらず、画面の表示が変更されるのは重たい処理が終わった後になります。
例えば以下のような画面があるとします。
この画面の「重たい処理」ボタンを押せばボタン上部にStartという文字が現れ、重たい処理終了後にEndという文字が表示されるとしましょう。
このときボタン押下時の処理を以下のように同期処理で実装してしまうとStartという文字が画面には表示されません。
private void Button_Click1(object sender, RoutedEventArgs e)
{
test.Content = "Start";
// 重たい処理開始
// 重たい処理開始
for (int i=0; i<1000000; ++i)
{
for (int j = 0; j < 1000000; ++j)
{
Math.Sqrt(j);
}
}
// 重たい処理終了
// 重たい処理終了
test.Content = "End";
}
こういう場合に重たい処理を以下のように非同期処理で実装していると開始時にはStartという文字が表示され、終了時にはEndという文字が表示されます。
private async void Button_Click1(object sender, RoutedEventArgs e)
{
test.Content = "Start";
// 重たい処理開始
await Task.Run(() =>
{
for (int i = 0; i < 1000000; ++i)
{
for (int j = 0; j < 1000000; ++j)
{
Math.Sqrt(j);
}
}
});
// 重たい処理終了
test.Content = "End";
}
2.ウィンドウが固まる
重い処理を非同期処理で実装していない場合、ウィンドウが固ってしまいウィンドウを移動させることができないという問題が起こります。
重い処理をしているんだからウィンドウが動かせないぐらいいいだろうとか思う人もいるかもしれませんが、ユーザからしたら使い勝手が最悪です。
最小化ボタンとかがついていないアプリの場合、常に画面の前面にでてきてかなりうざいです。
オープンソースのアプリでもたまにそういったものがありますが、ユーザの使い勝手を考えましょう。
3.アプリがダウンする
先ほどウィンドウが固まるという話をしましたが、最悪アプリがダウンする可能性もあります。
実際に私の携わっていた仕事の一つでは5時間ほど処理時間がかかるのにその間に誤って画面をクリックするとアプリがダウンするというものもありました。
個人開発レベルでもこれは不便だと思うので非同期処理をいれて対策をしましょう。
まとめ
今回、重い処理を非同期処理でするべき代表的な理由3つを紹介しました。
他にも色々とふべんな点があるのですが、同期処理で実装するメリットは設計が楽で手抜きできるぐらいしかなくデメリットが大きいのでWPFアプリケーションを作る場合は、スレッドを意識しながら設計やコーディングをするようにしましょう。