⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmbackgroundworkerusage.cs

📁 清华大学出版社出版的 移动应用开发宝典 张大威(2008)的附书源代码
💻 CS
字号:
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace CodeForChapter11cs
{
  public partial class frmBackgroundWorkerUsage : Form
  {
    public frmBackgroundWorkerUsage()
    {
      InitializeComponent();
    }

    BackgroundWorker bw;
    
    // cancel
    private void menuItem2_Click(object sender, EventArgs e)
    {
      if (bw != null)
        bw.CancelAsync(); 
    }

    // start
    private void menuItem1_Click(object sender, EventArgs e)
    {
      menuItem1.Enabled = false;
      textBox1.Enabled = false;
      label2.Text = "will kick it off";

      bw = new BackgroundWorker(this);
      bw.WorkerReportsProgress = true;
      bw.WorkerSupportsCancellation = true;

      bw.DoWork += new DoWorkEventHandler(bw_DoWork);
      bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
      bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

      object someState = textBox1.Text; 
      bw.RunWorkerAsync(someState);
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      // can touch UI. Thread communicates to UI. We don't have to Control.Invoke explicitly.
      object computationResult = e.Result;
      label2.Text = computationResult.ToString();

      menuItem1.Enabled = true;
      textBox1.Enabled = true;
    }

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      // worker reports progress. Again we can touch UI. Marshalling done for us
      label1.Text = e.UserState.ToString();
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
      // This is in worker thread. CAnnot touch UI from here
      BackgroundWorker b = (BackgroundWorker)sender;

      bool stillMoreWorkToDo = true; // this somehow changes to false in real scenario
      int progress = 0;
      while (stillMoreWorkToDo)
      {
        // optionally finish if user requested cancellation
        if (b.CancellationPending)
        {
          e.Cancel = true;
          e.Result = "cancelled " + e.Argument.ToString(); // could assign any other object
          return;
        }

        // do time consuming work
        System.Threading.Thread.Sleep(2000);

        // optionally report progress
        progress++; // real world calculates this
        object someOtherProgressVar = new Random().Next();
        b.ReportProgress(progress, someOtherProgressVar);

        // somehow determine job is done
        if (progress == 5) stillMoreWorkToDo = false;
      }

      e.Result = "finished :) " + e.Argument.ToString();  // could assign any other object
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -