UWPでカメラやおよそ一般人が使うとは思えない機器から入力された画像データを画面にプレビューして処理するアプリを仕事で作っています。海外の子会社が作っているプロダクトですが。
Problem
ぐらばく様のバックグラウンド スレッドで UI 要素を作るとメモリリークする (WPF) @karno様のバックグラウンドスレッドでUI要素を作るともっと問題は深刻かもしれない。(WPF)
で話題になっている案件ですが、UWPでもこの手の問題は起きるのでしょうか?
結論から言うと問題は起きないと思います。
というのも、UWPにおいてバックグランドスレッドにてDependencyObjectを作成することはできません。すべてDispatcherを経由する必要があります。
例えば、
1 | await Task.Run(()=>new WriteableBitmap(200, 200, 96, 96, PixelFormats.Bgr32, null)); |
みたいにしようならば、
こうなります。
Resolution
きちんとDispatcherを経由しましょうってことですね。
ちなみに、ViewModelとかまでDispatcherをもってくるのではなく、DispatcherServiceを用意して、Dispatcherを抽象化するべきです。
例えば、
WPF向け
1 | using System; |
UWP (Desktop)向け
1 | namespace UWP3.Services |
でPrismのUnityContainerあたりでDIを使って切り替えることができます。
こんな感じ。
1 | protected override Task OnInitializeAsync(IActivatedEventArgs args) |
Conclusion
そもそもバックグランドで生成できないようにする、というアプローチは安全かもしれませんね。