今天使用BackgroundWorker刷新UI发生延时现象,找了好久才发现AutoResetEvent可以解决,代码如下

        private void BgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int i = e.ProgressPercentage;
var str = "{'parameter':{'items':[{'lotId':'" + lstbar.Items[i] + "','parameterSeq':'0','parameterId':'FLD_GRADE','parameterValue':'A'}],'collectionType':'BY_LOT'}}";
var s = mes.dispatchLotForFR("M18", txtUserName.Text, txtDeviceName.Text.Trim(), "[\"" + lstbar.Items[i] + "\"]", str, false);
JObject jObject = (JObject)JsonConvert.DeserializeObject(s, jSettitng);
bool success = Convert.ToBoolean(jObject["success"]);
string msg = jObject["msg"].ToString();
lblDetail.Text = msg;
try
{
//记录MES过站
LotInfo lot = new LotInfo();
if (success)
{
lot.Success = true;
lblResult.Text = "过站成功";
lblResult.ForeColor = Color.Blue;
lblOK.Text = (++iNumOk).ToString();
iWorkerOK++;
WriteListBoxToFile(string.Format("组件序列号[{0}]过站[成功]消息[{1}],成功总计:[{2}]", lstbar.Items[i], msg,iNumOk));
}
else
{
lot.Success = false;
lblResult.Text = "过站失败";
lblResult.ForeColor = Color.Red;
lblNG.Text = (++iNumNG).ToString();
iWorkerNG++;
WriteListBoxToFile(string.Format("组件序列号[{0}]过站[失败]消息[{1}],失败总计[{2}]", lstbar.Items[i], msg,iNumNG));
sbNG.AppendLine(lstbar.Items[i].ToString());
} lot.LotNo = lstbar.Items[i].ToString();
//直接用设备号
//lot.DeviceNo= txtDeviceName.Text.Substring(4, 1) + txtDeviceName.Text.Substring(8, 2);
lot.DeviceNo = txtDeviceName.Text.Trim();
lot.Msg = msg;
lot.CreateTime = DateTime.Now;
if (tSet.IsInsertDb)
{
int k = lot.InsertDispatchLot(lot);
if (k > )
{
WriteListBoxToFile(string.Format("写入MES数据库成功,序列号:[{0}],设备号:[{1}],Success:[{2}],Msg:[{3}],时间:[{4}]", lot.LotNo, lot.DeviceNo, lot.Success, lot.Msg, lot.CreateTime));
}
else
{
WriteListBoxToFile(string.Format("写入MES数据库失败,序列号:[{0}],设备号:[{1}],Success:[{2}],Msg:[{3}],时间:[{4}]", lot.LotNo, lot.DeviceNo, lot.Success, lot.Msg, lot.CreateTime));
log.WriteExceptionLog(string.Format("写入MES数据库失败,序列号:[{0}],设备号:[{1}],Success:[{2}],Msg:[{3}],时间:[{4}]", lot.LotNo, lot.DeviceNo, lot.Success, lot.Msg, lot.CreateTime));
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
WriteListBoxToFile(ex.Message);
log.WriteExceptionLog(ex.Message);
}
waitHandler.Set();
}
        private void btnDispatch_Click(object sender, EventArgs e)
{
btnDispatch.Enabled = false;
if (txtDeviceName.Text.Length < )
{
MessageBox.Show("设备号名称长度不能小于10个字符");
btnDispatch.Enabled = true;
lstbar.Items.Clear();
return;
} if (lstbar.Items.Count > )
{
if (bgWorker.IsBusy != true)
{
waitHandler = new AutoResetEvent(false);
bgWorker.RunWorkerAsync(lstbar.Items.Count);
}
}
else
{
MessageBox.Show("列表框内至少存在1个条码才可以过站");
}
btnDispatch.Enabled = true;
}
        private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = ; i < (int)e.Argument; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
if (tSet.ScanMode == "S")
{
System.Threading.Thread.Sleep();
}
else
{
System.Threading.Thread.Sleep(tSet.IntervalTime);
}
worker.ReportProgress(i);
waitHandler.WaitOne();
}
}
}

这个方法也不是我想出来的,参考了下面的大神

使用BackgroundWorker时,出现ProgressChanged延迟的现象,请帮分析下原因

[C#]使用BackgroudWorker刷新UI延迟的解决方法的更多相关文章

  1. QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)

    QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...

  2. C# Winform频繁刷新导致界面闪烁解决方法

    C#Winform频繁刷新导致界面闪烁解决方法 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET Framework 提供的默认双缓冲将 ...

  3. winform频繁刷新导致界面闪烁解决方法

    转自龙心文 原文 winform频繁刷新导致界面闪烁解决方法 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET Framework 提供 ...

  4. Linux-485收发切换延迟的解决方法

    [前言] 本文引用各种资料甚多,而引用出处标明并不详细,若有侵权,请联系删除. 转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10381616.html ...

  5. Unity中UI界面颤抖解决方法

    将Render Mode中属性改为Screen Space - Camera 摄像机挂在Canvas属性下会出现UI界面颤抖的效果. UI界面颤抖解决方式:将Render Mode中属性改为Scree ...

  6. 前端vue项目部署到tomcat,一刷新报错404解决方法

    公司前端写的后台部署到tomcat webapps目录下后,无法进行刷新,一刷新就会报错404,自动跳的404页面.在网上查了下,官方说是HTML5 History 模式引发的问题,但是解决方案中,并 ...

  7. 鼠标聚焦到Text输入框时,按回车键刷新页面原因及解决方法

    前提 一个form中只有一个输入框,当输入框获取焦点后,点击回车,导致整个页面都刷新,问题解决办法. 1.处理form  在form中添加事件 <form onsubmit="retu ...

  8. Unity中UGUI鼠标穿透UI问题的解决方法

    不过在使用时需要先获取两个红色显示的变量,graphicRaycaster和eventSystem. 这两个变量分别对应的是Canvas中的GraphicRaycaster组件和创建UI时自动生成的“ ...

  9. easyui refresh 刷新两次的解决方法(推荐)

    //这样写刷新两次 $("#windowid").window('refresh','url01.php'); $("#windowid").window('o ...

随机推荐

  1. Amdahl定律和可伸缩性

    性能的思考 提升性能意味着可以用更少的资源做更多的事情.但是提升性能会带来额外的复杂度,这会增加线程的安全性和活跃性上的风险. 我们渴望提升性能,但是还是要以安全为首要的.首先要保证程序能够安全正常的 ...

  2. jdbc结合commons-dbutils-1.6.jar做素材数据处理的例子

    前两个 insertTitle,insertOpening 是刚开始做的针对单一素材数据解析及写入的方法,后面一个 insertMaterial 是后期封装的一个可处理各种素材导入的方法,main方法 ...

  3. java不用中间变量交换两个值

    public void changeVal(){ int a = 2; int b = 3; System.out.println("交换前 a:"+a+",b:&quo ...

  4. SQL-W3School-基础:SQL 语法

    ylbtech-SQL-W3School-基础:SQL 语法 1.返回顶部 1. 数据库表 一个数据库通常包含一个或多个表.每个表由一个名字标识(例如“客户”或者“订单”).表包含带有数据的记录(行) ...

  5. 010-数据结构-树形结构-B树[B-树]

    一.概述 B 树就是常说的“B 减树(B- 树)”,又名平衡多路(即不止两个子树)查找树. 在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序.这种数据结构能够让查找数据.顺 ...

  6. spark的RDD如何转换为DataFrame

    1.Dataset与RDD之间的交互 Spark仅支持两种方式来将RDD转成Dataset.第一种方式是使用反射来推断一个RDD所包含的对象的特定类型.这种基于反射的方式会让代码更加地简洁,当你在编写 ...

  7. 由DBCursor的“can't switch cursor access methods”异常引发的思考

    先谈谈我是怎么用的: DBCollection dbcollection = XXXXXXXXXX(); //连接mongo DBCursor dbCursor = mergeVideoDB.find ...

  8. ElasticSearch——自定义模板

    output中配置 elasticsearch{ action => "index" hosts => ["xxx"] index => &q ...

  9. lumen中间件中设置响应header

    <?php namespace App\Http\Middleware; use Closure; class BeforeMiddleware { public function handle ...

  10. 2. bash基础

    通配符 通配符 功能说明 实例 * 匹配所有字符 ls *.o ? 匹配所有的当个字符 ls net??? [a-z] 匹配属于a到z范围集合内的一个字符 ls [a-i]* [...] 与方括号内的 ...