Winformでマルチスレッドによるアプリケーションの停止を防ぐにはどうすればよいですか?

アプリケーションがユーザーの操作に対して応答し続けることができるようにするには、長時間実行される処理(例:ネットワークリクエスト、負荷の高い計算タスク)は、メインスレッドで実行しないで、スレッドを分けて実行する必要があります。

UI スレッドをロックしないマルチスレッド手法:

  1. 長時間実行する操作を新しいスレッドで実行します。スレッドを作成および管理するには、ThreadクラスまたはTaskクラスを使用します。
Thread thread = new Thread(LongRunningOperation);
thread.Start();

または、タスククラスを使用する。

Task.Run(() =>
{
    LongRunningOperation();
});
  1. 長時間にわたって実行される操作の中では、UIコントロールに直接アクセスしないでください。UIコントロールは、メインスレッドでのみアクセスできます。UIを更新する必要がある場合は、UI更新の操作を Invoke または BeginInvoke メソッドを使用してメインスレッドに委任できます。
private void LongRunningOperation()
{
    // 长时间运行的操作
    // ...

    // 更新UI控件
    this.Invoke((Action)(() =>
    {
        // 更新UI控件的操作
        // ...
    }));
}
  1. ユーザー体験向上には、操作中のことをユーザーに知らせるために適切なUIアニメーションやプログレスバーを設置することで実現できます。
  2. 長時間にわたって実行される操作で、途中で中止したい場合は、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アプリケーションの画面のフリーズ問題を回避し、ユーザーエクスペリエンスを向上させることができます。

bannerAds