Winfrom中backgroundworker多线程的问题 现在我要使用backgroundworker多线程控件将数据放入接口中(注:只能使用这种多线程方法),接口返回true或false,如果是false则将数据插入到界面的listview中,新手高分求大神解决,在线等!请将backgroundworker的三个方法具体该放哪些操作详细说明!跪谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 希望对你有帮助http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html RunWorkerAsync() 开始后台运行执行,该函数后将触发bgw.DoWorker事件,需要执行的操作写在DoWorker事件响应函数里,该函数也可以加参数,参数从DoWorker事件处理函数的e.Arguement里获取 CancelAsync() 申请后台程序停止,注意该函数不能实际停止后台程序,只能将bgw的CancellationPending 值设为true,需要自己在后台运行的程序中判断这一值,进而停止后台程序的运行. 注意本方法使用前,需要将bgw的WorkerSupportsCancellation 值设为true,否则将不起作用. ReportProgress() 在后台程序中调用,向主线程传送进度信息,可以带一个或两个参数,一个为INT类型的进度(0~100),一个为自定义类型的参数,可以传任意信息. 调用后,将触发bgw.ProgressChanged事件,可以将界面变化的代码写在该事件响应函数中,之前提到的两个参数均可从bgw.ProgressChanged事件响应函数的参数e中获取,分别为e.ProgressPercentage和e.UserState. 注意本方法使用前,需要将bgw的WorkerReportsProgress值设为true,否则将不会触发事件. 既然不清楚,那我直接上代码 //这一段是用DoWork操作数据读取,将读取到的数据扔给下面的checkRead()方法;private void connectWorker_DoWork(object sender, DoWorkEventArgs connectEvent) { if (m_IsConnected) { Symbol.RFID3.TagData[] tagData = m_ReaderAPI.Actions.GetReadTags(1000); if (tagData != null) { for (int nIndex = 0; nIndex < tagData.Length; nIndex++) { if (tagData[nIndex].OpCode == ACCESS_OPERATION_CODE.ACCESS_OPERATION_NONE || (tagData[nIndex].OpCode == ACCESS_OPERATION_CODE.ACCESS_OPERATION_READ && tagData[nIndex].OpStatus == ACCESS_OPERATION_STATUS.ACCESS_SUCCESS)) { Symbol.RFID3.TagData tag = tagData[nIndex]; tagID = tag.TagID; checkRead(tagID); } } } } } //调用接口 private void checkRead(string epc_code) { try { string err = string.Empty; bool ret = false; SmartLinkWS smart = new SmartLinkWS(); ret = smart.Check_SF_IsAlarm(epc_code, GlobalVar.localPara.DeviceNo, ref err); if (ret == false) { return; } else { //如果为flase 先循环列表有没有,如果有,比对时间是否在10秒内 if (inventoryList.Items.Count > 0) { bool flag = false; for (int i = 0; i < inventoryList.Items.Count; i++) { string temp = inventoryList.Items[i].SubItems[0].Text; if (epc_code == temp) //如果有 { flag = true; string epctime = inventoryList.Items[i].SubItems[1].Text; DateTime time1 = Convert.ToDateTime(epctime); TimeSpan ts = DateTime.Now - time1; if (Convert.ToInt32(ts.TotalSeconds) > 10) //判断时间是否大于10秒 是报警 { m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE; m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE; } break; } } if (flag == false) { m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE; m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE; ListViewItem item = new ListViewItem(epc_code); //加入扫描时间 item.SubItems.Add(DateTime.Now.ToString()); //加入扫描机器号 item.SubItems.Add(txtNo.Text); inventoryList.Items.Add(item); ////刷新列表 //inventoryList.BeginUpdate(); ////停止刷新列表 //inventoryList.EndUpdate(); } //MessageBox.Show("OK1"); } else { m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE; m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE; ListViewItem item = new ListViewItem(epc_code); //加入扫描时间 item.SubItems.Add(DateTime.Now.ToString()); //加入扫描机器号 item.SubItems.Add(txtNo.Text); inventoryList.Items.Add(item); //MessageBox.Show("OK"); ////刷新列表 ////inventoryList.BeginUpdate(); ////停止刷新列表 ////inventoryList.EndUpdate(); }现在的问题是在往listview里面插入数据时会出现异常: 这是因为跨线程访问了inventoryList了.提示信息已经说明了. 可以先对inventoryList进行访问判断,如果不行再Invoke调用:if (inventoryList.IsAccessible) Do something; else { inventoryList.Invoke(new ThreadStart(delegate() { Do something; })); },搂主给分呀 将inventoryList.IsAccessible替换成inventoryList.InvokeRequired. dowork里做异步的事情,不能访问ui控件。process里处理进度条问题。complete里做完成的操作。可以访问ui控件。 我的问题是backgroundworker多线程,为什么给我弄个委托线程出来呢?我现在已经用backgroundworker线程搞定了。 在线程中是不能访问控件,可以调用控件的Invoke方法this.Invoke(new MethodInvoker(delegate { this.Text= "Hello World!"; //this 为Form窗体 })); 在另一个类中修改主窗口的Label.Text属性的问题 写个简单的正则表达式.急!..在线等... c# WEB 远程监控问题 过客看到就来帮忙下,谢谢啦!!!用正则求出下面DIV中所有的IMG 怎么在一列中重复添加a,b,c 把word中的图片导出到服务器上 抓狂了!请问ImageFormat.MemoryBmp格式怎么转ImageFormat.Bmp格式? 请教一个复杂查询绑定的datagrid怎么更新到主表(SQL数据库)中? 怎样增加datagrid的表头高度 如何安装VS.NET。 C#新手简单问题 用线程打开pdf时报错
http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html
开始后台运行执行,该函数后将触发bgw.DoWorker事件,需要执行的操作写在DoWorker事件响应函数里,该函数也可以加参数,参数从DoWorker事件处理函数的e.Arguement里获取
CancelAsync()
申请后台程序停止,注意该函数不能实际停止后台程序,只能将bgw的CancellationPending 值设为true,需要自己在后台运行的程序中判断这一值,进而停止后台程序的运行.
注意本方法使用前,需要将bgw的WorkerSupportsCancellation 值设为true,否则将不起作用.
ReportProgress()
在后台程序中调用,向主线程传送进度信息,可以带一个或两个参数,一个为INT类型的进度(0~100),一个为自定义类型的参数,可以传任意信息.
调用后,将触发bgw.ProgressChanged事件,可以将界面变化的代码写在该事件响应函数中,之前提到的两个参数均可从bgw.ProgressChanged事件响应函数的参数e中获取,分别为e.ProgressPercentage和e.UserState.
注意本方法使用前,需要将bgw的WorkerReportsProgress值设为true,否则将不会触发事件.
//这一段是用DoWork操作数据读取,将读取到的数据扔给下面的checkRead()方法;
private void connectWorker_DoWork(object sender, DoWorkEventArgs connectEvent)
{
if (m_IsConnected)
{
Symbol.RFID3.TagData[] tagData = m_ReaderAPI.Actions.GetReadTags(1000);
if (tagData != null)
{
for (int nIndex = 0; nIndex < tagData.Length; nIndex++)
{
if (tagData[nIndex].OpCode == ACCESS_OPERATION_CODE.ACCESS_OPERATION_NONE ||
(tagData[nIndex].OpCode == ACCESS_OPERATION_CODE.ACCESS_OPERATION_READ &&
tagData[nIndex].OpStatus == ACCESS_OPERATION_STATUS.ACCESS_SUCCESS))
{
Symbol.RFID3.TagData tag = tagData[nIndex];
tagID = tag.TagID;
checkRead(tagID);
}
}
}
}
}
//调用接口
private void checkRead(string epc_code)
{
try
{
string err = string.Empty; bool ret = false;
SmartLinkWS smart = new SmartLinkWS();
ret = smart.Check_SF_IsAlarm(epc_code, GlobalVar.localPara.DeviceNo, ref err);
if (ret == false)
{
return;
} else
{
//如果为flase 先循环列表有没有,如果有,比对时间是否在10秒内
if (inventoryList.Items.Count > 0)
{
bool flag = false; for (int i = 0; i < inventoryList.Items.Count; i++)
{
string temp = inventoryList.Items[i].SubItems[0].Text;
if (epc_code == temp) //如果有
{
flag = true;
string epctime = inventoryList.Items[i].SubItems[1].Text;
DateTime time1 = Convert.ToDateTime(epctime); TimeSpan ts = DateTime.Now - time1;
if (Convert.ToInt32(ts.TotalSeconds) > 10) //判断时间是否大于10秒 是报警
{
m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE;
m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE;
} break;
}
} if (flag == false)
{
m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE;
m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE; ListViewItem item = new ListViewItem(epc_code); //加入扫描时间
item.SubItems.Add(DateTime.Now.ToString()); //加入扫描机器号
item.SubItems.Add(txtNo.Text); inventoryList.Items.Add(item); ////刷新列表
//inventoryList.BeginUpdate();
////停止刷新列表
//inventoryList.EndUpdate();
}
//MessageBox.Show("OK1");
} else
{
m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE;
m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE; ListViewItem item = new ListViewItem(epc_code);
//加入扫描时间
item.SubItems.Add(DateTime.Now.ToString()); //加入扫描机器号
item.SubItems.Add(txtNo.Text);
inventoryList.Items.Add(item);
//MessageBox.Show("OK"); ////刷新列表
////inventoryList.BeginUpdate();
////停止刷新列表
////inventoryList.EndUpdate();
}
现在的问题是在往listview里面插入数据时会出现异常:
提示信息已经说明了.
if (inventoryList.IsAccessible)
Do something;
else
{
inventoryList.Invoke(new ThreadStart(delegate()
{
Do something;
}));
}
,搂主给分呀
process里处理进度条问题。
complete里做完成的操作。可以访问ui控件。
{ this.Text= "Hello World!"; //this 为Form窗体
}));