📄 frmbackgroundworkerusage.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 + -