Winformでマルチスレッドによるアプリケーションの停止を防ぐにはどうすればよいですか?
アプリケーションがユーザーの操作に対して応答し続けることができるようにするには、長時間実行される処理(例:ネットワークリクエスト、負荷の高い計算タスク)は、メインスレッドで実行しないで、スレッドを分けて実行する必要があります。
UI スレッドをロックしないマルチスレッド手法:
- 長時間実行する操作を新しいスレッドで実行します。スレッドを作成および管理するには、ThreadクラスまたはTaskクラスを使用します。
Thread thread = new Thread(LongRunningOperation);
thread.Start();
または、タスククラスを使用する。
Task.Run(() =>
{
LongRunningOperation();
});
- 長時間にわたって実行される操作の中では、UIコントロールに直接アクセスしないでください。UIコントロールは、メインスレッドでのみアクセスできます。UIを更新する必要がある場合は、UI更新の操作を Invoke または BeginInvoke メソッドを使用してメインスレッドに委任できます。
private void LongRunningOperation()
{
// 长时间运行的操作
// ...
// 更新UI控件
this.Invoke((Action)(() =>
{
// 更新UI控件的操作
// ...
}));
}
- ユーザー体験向上には、操作中のことをユーザーに知らせるために適切なUIアニメーションやプログレスバーを設置することで実現できます。
- 長時間にわたって実行される操作で、途中で中止したい場合は、Cancellation Tokenを利用できます。たとえば、キャンセルボタンが押されたときにCancellation TokenのCancelメソッドを設定します。
private CancellationTokenSource cancellationTokenSource;
private void btnCancel_Click(object sender, EventArgs e)
{
if (cancellationTokenSource != null)
{
cancellationTokenSource.Cancel();
}
}
private void LongRunningOperation()
{
cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;
try
{
// 长时间运行的操作
// ...
// 更新UI控件
this.Invoke((Action)(() =>
{
// 更新UI控件的操作
// ...
}));
}
catch (OperationCanceledException)
{
// 如果任务被取消,则在这里处理取消的逻辑
this.Invoke((Action)(() =>
{
// 更新UI控件的操作
// ...
}));
}
}
マルチスレッドと適切なUI更新により、Winformアプリケーションの画面のフリーズ問題を回避し、ユーザーエクスペリエンスを向上させることができます。