在C#中可以使用两种方式调用多线程
第一种方法为使用工具中的控件调用,工具中含有三个响应事件分别来处理开始、完成进度、完成三个事物,在使用时一般将WorkerSupportsCancellation设置为true,
WorkerSupportsCancellation代表是否支持中断多线程操作,使用此种方法简单同时可以记录进度。
第二种方法为使用Thread类定义线程。
针对第一种方法:
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
backgroundWorker1.ReportProgress(1,"lalala");
break;
}
for(int j = 0;j<5;j++) { Do nothing};
Thread.Sleep(1000);
DateTime dt = DateTime.Now;
string str = dt.ToString();
System.Diagnostics.Trace.WriteLine(str);
}
}
private void Btn_Start_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy) return;
backgroundWorker1.RunWorkerAsync();
}
private void Btn_Stop_Click(object sender, EventArgs e)
{
if (backgroundWorker1 == null || !backgroundWorker1.IsBusy) return; ;
if (!backgroundWorker1.WorkerSupportsCancellation) return; ;
backgroundWorker1.CancelAsync();
}
此方法在点击关闭按钮后调用backgroundWorker1.CancelAsync()将backgroundWorker.CancellationPending置true,接下来在backgroundWorker_DoWork中判断CancellationPending的值,为true则break掉,此方法的缺点是如果我不能实时停止线程,将CancellationPending置true后backgroundWorker_DoWork中的第二个循环
会继续执行完。
针对第二种方法:
Thread td = null;
private void Btn_Create_Click(object sender, EventArgs e)
{
if (td != null)
{
if (td.IsAlive) return;
}
td = new Thread(new ThreadStart(RunThread));
td.Start();
}
private void RunThread()
{
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(1000);
DateTime dt = DateTime.Now;
string str = dt.ToString();
System.Diagnostics.Trace.WriteLine(str);
}
}
private void Btn_ThreadStop_Click(object sender, EventArgs e)
{
if (td != null)
{
td.Abort();
td = null;
}
}
点击停止后可以随时停掉线程中的for循环,使用时在关闭窗口后记得关闭线程
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (td != null)
{
td.Abort();
td = null;
}
}