我用timer每秒执行backgroundworker中的代码,在complete中总是出现"线程不安全"提示,就是控件的安全性调用问题.
我的WINFORM中使用了多个backgroundworker代码如下:
//定时器启动
m_Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
m_Timer.AutoReset = true;
m_Timer.Enabled = true;//dowork
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
String returnMsg = m_SMS();
//返回信息
e.Result = returnMsg;
}//Completeprivate void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.label1.Text = e.Result.ToString();//就这一句出现线程安全提示
}我看了MSDN,上述代码没发现什么异常,不知道是不是定时器引起的?
我的WINFORM中使用了多个backgroundworker代码如下:
//定时器启动
m_Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
m_Timer.AutoReset = true;
m_Timer.Enabled = true;//dowork
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
String returnMsg = m_SMS();
//返回信息
e.Result = returnMsg;
}//Completeprivate void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.label1.Text = e.Result.ToString();//就这一句出现线程安全提示
}我看了MSDN,上述代码没发现什么异常,不知道是不是定时器引起的?
解决方案 »
- 如何向DataSet中添加DataTable的数据
- 如何响应外部网站的按钮提交事件,当点击提交时候把输入的信息添加到指定的数据库?
- 多重数组怎么来赋值?
- 未处理的“System.FormatException”类型的异常出现在 mscorlib.dll 中(无法识别的 GUID 格式)
- hplyl
- sqldatareader 的 read()出提示:阅读器关闭时 Read 的尝试无效 请前辈指点!!
- 100分求助,如何得到Excel有效单元格的范围?
- 如何将得到的dataset插入到数据库表中??急
- 自己做了一个控件,可是就是不能显示,只有80分了全给了,求指点
- 请问
- 菜鸟问题:初学者请教一个VC#2008+sql2005编写窗体程序的登陆问题
- 写入app.config的几个问题?
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!this.bgWorker.IsBusy)
{
//执行后台操作
this.bgWorker.RunWorkerAsync();
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); System.Windows.Forms.Timer m_Timer = new System.Windows.Forms.Timer();
m_Timer.Tick += new System.EventHandler(this.m_Timer_Tick);
m_Timer.Interval = 2000;
m_Timer.Enabled = true;
} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(3000);
String returnMsg = DateTime.Now.ToString();
//返回信息
e.Result = returnMsg;
} private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = e.Result.ToString();//就这一句出现线程安全提示
} //定时器代码
private void m_Timer_Tick(object sender, EventArgs e)
{
if (!this.backgroundWorker1.IsBusy)
{
//执行后台操作
this.backgroundWorker1.RunWorkerAsync();
}
} }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;/*
* 作者:周公
* BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
* 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
* 它有几个属性:
* CancellationPending——指示应用程序是否已请求取消后台操作。
* IsBusy——指示 BackgroundWorker 是否正在运行异步操作
* WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
* WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消
* 还有如下事件:
* DoWork——调用 RunWorkerAsync 时发生。
* ProgressChanged——调用 ReportProgress 时发生。
* RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
*
* 还有如下方法:
* CancelAsync——请求取消挂起的后台操作
* ReportProgress——引发 ProgressChanged 事件
* RunWorkerAsync——开始执行后台操作
*
**/
namespace BackgroundWorkerDemo
{
public partial class MainForm : Form
{
private BackgroundWorker worker = new BackgroundWorker();
public MainForm()
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
//正式做事情的地方
worker.DoWork+=new DoWorkEventHandler(DoWork);
//任务完称时要做的,比如提示等等
worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
//任务进行时,报告进度
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
} //调用 RunWorkerAsync 时发生
public void DoWork(object sender, DoWorkEventArgs e)
{
e.Result = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束
}
//调用 ReportProgress 时发生
public void ProgessChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
//当后台操作已完成、被取消或引发异常时发生
public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("完成!");
} private int ComputeFibonacci(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 1000; i++)
{
if (worker.CancellationPending)
{
e.Cancel = true;
return -1;
}
else
{
worker.ReportProgress(i);
}
System.Threading.Thread.Sleep(10);
}
return -1;
} private void btnStart_Click(object sender, EventArgs e)
{
worker.RunWorkerAsync();
btnStart.Enabled = false;
btnPause.Enabled = true;
} private void btnPause_Click(object sender, EventArgs e)
{
btnPause.Enabled = false;
btnStart.Enabled = true;
worker.CancelAsync();
}
}
}