UI のマルチスレッド非同期更新を実装するための C# での Winform のサンプル コードの詳細な紹介

黄舟
リリース: 2017-03-21 11:18:42
オリジナル
1874 人が閲覧しました

この記事では主に C# での Winform のマルチスレッド非同期更新 UI (進行状況とステータス情報) を紹介します。編集者が非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう

はじめに

大量のデータの読み書き操作を必要とする Winform プログラムを開発する場合、多くの場合、ある程度の時間がかかりますが、この間にインターフェイス UI が作成されます。更新すると、インターフェイスが一時停止アニメーション状態になっているように見え、ユーザー エクスペリエンスが低下します。したがって、大量のデータを処理するアプリケーションでは、この状況に対処するためにマルチスレッドを使用する必要があります。 C# でマルチスレッドを使用するには、System.Threading.Thread のインスタンスの Start メソッドを使用するだけで非常に便利ですが、マルチスレッド間の対話を実現する方法はそれほど単純ではありません。この記事では、サブスレッドを使用してデータを処理し、メインスレッドの UI ステータスをリアルタイムで更新する方法を実装します。非同期スレッド更新 UI のデモ プログラムを段階的に実装してみましょう。

アプリケーションの背景

一定量のデータをテキスト ファイルに書き込み、データの書き込みのリアルタイムの進行状況をメイン インターフェイスに反映する必要があります。要件: 書き込まれたデータはクラスにカプセル化される必要があります。

実装プロセス

1. まずwinformプロジェクトを作成し、メインフォームにボタン、プログレスバー、ラベルをドラッグします。以下に示すように。

2. データを処理するクラス(WriteDate)を記述します。 ソースコードは次のとおりです。

 public class DataWrite
 {
  public delegate void UpdateUI(int step);//声明一个更新主线程的委托
  public UpdateUI UpdateUIDelegate;

  public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
  public AccomplishTask TaskCallBack;
  
  public void Write(object lineCount)
  {
   StreamWriter writeIO = new StreamWriter("text.txt", false, Encoding.GetEncoding("gb2312"));
   string head = "编号,省,市";
   writeIO.Write(head);
   for (int i = 0; i < (int)lineCount; i++)
   {
    writeIO.WriteLine(i.ToString() + ",湖南,衡阳");
    //写入一条数据,调用更新主线程ui状态的委托
    UpdateUIDelegate(1);
   }
   //任务完成时通知主线程作出相应的处理
   TaskCallBack();
   writeIO.Close();
  }
 }
ログイン後にコピー

3. メインインターフェイスのコードは次のとおりです:

まず、作成されていないコントロールのスレッド更新コントロールを実装するためのデリゲートを作成します。

delegate void AsynUpdateUI(int step);
ログイン後にコピー

次に、データを書き込むメソッドとコールバック関数を開始する複数のスレッドを記述します。

  private void btnWrite_Click(object sender, EventArgs e)
  {
   int taskCount = 10000; //任务量为10000
   this.pgbWrite.Maximum = taskCount;
   this.pgbWrite.Value = 0;

   DataWrite dataWrite = new DataWrite();//实例化一个写入数据的类
   dataWrite.UpdateUIDelegate += UpdataUIStatus;//绑定更新任务状态的委托
   dataWrite.TaskCallBack += Accomplish;//绑定完成任务要调用的委托

   Thread thread = new Thread(new ParameterizedThreadStart(dataWrite.Write));
   thread.IsBackground = true;
   thread.Start(taskCount);
  }

  //更新UI
  private void UpdataUIStatus(int step)
  {
   if (InvokeRequired)
   {
    this.Invoke(new AsynUpdateUI(delegate(int s)
    {
     this.pgbWrite.Value += s;
     this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
    }), step);
   }
   else
   {
    this.pgbWrite.Value += step;
    this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
   }
  }

  //完成任务时需要调用
  private void Accomplish()
  {
   //还可以进行其他的一些完任务完成之后的逻辑处理
   MessageBox.Show("任务完成");
  }
ログイン後にコピー

効果は以下の通りです

まとめ

UIの非同期更新を実装する方法は色々ありますが、この方法の方がより柔軟で実際のタスクのステータスを取得できると思います時刻に応じて応答し、対応する処理を実行します。このモードは、複数のスレッドを使用して異なるデータを異なるファイルに同時に書き込む場合にも適しています。

以上がUI のマルチスレッド非同期更新を実装するための C# での Winform のサンプル コードの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート