今天使用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. ffmpe转码添加时间水印

    ffmpeg出直播流的时候 添加时间水印的话可以观察延迟 录制也方便查问题下面的命令 需要用到的字体自己百度下载一下或者到C:\Windows\Fonts复制一下 ffmpeg -stream_loo ...

  2. 487-3279 字符串处理+MAP

    487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 300264   Accepted: 53757 Descr ...

  3. 性能优化 | JVM与性能优化知识点综合整理

    JVM JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. java编译 ...

  4. mysql查询json字段

    一张test表里存了一个content字段是json类型的,查询该content里manualNo这个字段 select JSON_EXTRACT (test .content, '$.manualN ...

  5. 利用phpStudy 探针 提权网站服务器

    声明: 本教程仅仅是演示管理员安全意识不强,存在弱口令情况.网站被非法入侵的演示,请勿用于恶意用途! 今天看到论坛有人发布了一个通过这phpStudy 探针 关键字搜索检索提权网址服务器,这个挺简单的 ...

  6. 从源码看 Vue 中的 Mixin

    最近在做项目的时候碰到了一个奇怪的问题,通过 Vue.mixin 方法注入到 Vue 实例的一个方法不起作用了,后来经过仔细排查发现这个实例自己实现了一个同名方法,导致了 Vue.mixin 注入方法 ...

  7. Linux 查看 MySQL的版本信息

    Linux 查看 MySQL的版本信息 如何查看某台 Linux 主机上的 安装的 MySQL版本信息? 使用如下命令,查看 MySQL的版本信息: mysql -V 或者 mysql --versi ...

  8. MATLAB学习(二)读写xls文件

    >> N=xlsread('DRINK.xls','DRINK','A1:D8') N = 207.2000 3.3000 15.5000 2.8000 36.8000 5.9000 12 ...

  9. kettle记录集(Merge Join)使用

    果两个表需要进行连接查询筛选出数据,那么可以使用记录集组件.(Merge Join). 使用之前要进行排序: 使用记录集之前,要对输入的两张表进行排序,如果不排序,会导致两张表连接的时候出现问题,关联 ...

  10. 树莓派实现摄像头监控(使用motion和mjpg-streamer)

    购买raspBerryCarmen,大概20元, 启动树莓派,安装: `sudo apt install motion` 配置/etc/motion/motion.conf, `sudo vim /e ...