C# WPF 動作時の挙動について


C# WPF  
初歩的なことで申し訳ないのですが、予め準備してあるデータをループなどで処理しているときにMainWindowが操作不能になるはどうにかできないのでしょうか？  
Timerを用いて無限ループを回避しても、一定時間は動くのがとまってしまいます。

何か解決方法、もしくは仕組みについての参考文献等があればお教えいただきたいです。




まず、最初に理解するべきなのは、この場合マルチスレッド処理が必要ということです。  
WPFでは、UI上のボタンが押下された場合など、コードビハインドやコマンドパターンで呼び出されるメソッドはUIスレッドで動作します。UIスレッドは描画に使用されるスレッドですから、そのまま長時間そのメソッド内で処理を行い続けるとUIの描画が止まってしまうのです。

様々な手続きで、長時間メソッド内で処理を継続したい場合、UIスレッドとは別のスレッドで実行する必要があります。マルチスレッド処理に関しては単純にこうすれば解決、という話ではなく非常に複雑な問題が絡み合うので、WPF+マルチスレッドやUIスレッドについていろいろと検索してみてください。

昨今の解決策としては、takemori_kondoさんの挙げているasync/awaitやTaskを利用するのがモダンな手法ですが、古典的なアプローチとしてはBackgroundWorker等を利用したり、よりプリミティブにThreadを自分で生成することもできます。  
async/awaitは非常に便利なのですが、マルチスレッドは非常に奥が深くやっかいな問題ですので、まずはプリミティブな手法を色々と試すなどして理解を深められることをお薦めします。

.NET開発における非同期処理の基礎と歴史（1/2） - ＠IT  
<http://www.atmarkit.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_01.html>  
非同期処理の基礎  
<https://www.slideshare.net/ufcpp/ss-34533225>

【WPF】お手軽簡単別スレッド BackgroundWorker | 創造的プログラミングと粘土細工  
<http://pro.art55.jp/?eid=1180258>




まず、最初に理解するべきなのは、この場合マルチスレッド処理が必要ということです。  
WPFでは、UI上のボタンが押下された場合など、コードビハインドやコマンドパターンで呼び出されるメソッドはUIスレッドで動作します。UIスレッドは描画に使用されるスレッドですから、そのまま長時間そのメソッド内で処理を行い続けるとUIの描画が止まってしまうのです。

様々な手続きで、長時間メソッド内で処理を継続したい場合、UIスレッドとは別のスレッドで実行する必要があります。マルチスレッド処理に関しては単純にこうすれば解決、という話ではなく非常に複雑な問題が絡み合うので、WPF+マルチスレッドやUIスレッドについていろいろと検索してみてください。

昨今の解決策としては、takemori_kondoさんの挙げているasync/awaitやTaskを利用するのがモダンな手法ですが、古典的なアプローチとしてはBackgroundWorker等を利用したり、よりプリミティブにThreadを自分で生成することもできます。  
async/awaitは非常に便利なのですが、マルチスレッドは非常に奥が深くやっかいな問題ですので、まずはプリミティブな手法を色々と試すなどして理解を深められることをお薦めします。

.NET開発における非同期処理の基礎と歴史（1/2） - ＠IT  
<http://www.atmarkit.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_01.html>  
非同期処理の基礎  
<https://www.slideshare.net/ufcpp/ss-34533225>

【WPF】お手軽簡単別スレッド BackgroundWorker | 創造的プログラミングと粘土細工  
<http://pro.art55.jp/?eid=1180258>

