Winform之跨线程访问控件(在进度条上显示字体)
此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理 有很好的解决方案(个人认为的。有更好的方案欢迎交流。)
在做跨线程访问之前我们先了解下我们所做的需要达到的效果:

这个是批量的将xml文件导入sqlite数据库 每个xml有将近3000的节点 每个节点有5个属性,如果我们不用线程那么在数据导入的过程中 程序很可能卡死 而且基本上动不了,用户的体验性就很差。
所以我们对向数据库添加数据的地方使用了线程:
Thread thread = new Thread(new ThreadStart(() =>
{
try
{
ExeInsertDatabase(); //数据导入
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "导入提示");
return;
}
}));
thread.Start();
线程是很好创建 但是毕竟xml文件太多 即使每一个只需要1-2秒 但是几千个xml要几分钟的时间,在这个过程中我们需要让用户看到这个进度。那么 加一个进度条:
Font font = new Font("微软雅黑", (float)8, FontStyle.Regular); //进度条上显示的字体
PointF pointF = new PointF(this.pbImport.Width / 4 - 10, this.pbImport.Height / 2 - 8); //字体显示的位置
pbImport.Value = 0;
pbImport.Minimum = 0;
pbImport.Step = 1;
this.pbImport.CreateGraphics().DrawString("正在导入(这里写导入的文件名称或者是导入的进度等信息)", font, Brushes.Black, pointF);
看到这里你就想到了 数据库插入数据 在线程里面 进度条的增长是不是也要在线程里面加入? 是不是要写上this.pbImport.Value++;? this.pbImport.CreateGraphics().DrawString("正在导入(这里写导入的文件名称或者是导入的进度等信息)", font, Brushes.Black, pointF); 这个是不是也要加入到线程内才能刷新进度条的进度信息?
你可以试试。。。
那么会出现如下错误:
从不是创建控件 “控件名称”的线程访问它
yes 下面就是这个问题的解决方案:
private delegate void SetImportM();
private void ImportMessage()
{
if (this.InvokeRequired)
{
SetImportM s = new SetImportM(ImportMessage);
this.Invoke(s);
}
else
{
string strText = "正在导入文件" + filePaths[index] + "..." + (index + 1) + "/" + filePaths.Count;
this.pbImport.CreateGraphics().DrawString(strText, font, Brushes.Black, pointF);
}
}
我们使用了委托解决这个问题用来追加数据库的进度, 只需要在向数据库插入数据的地方去调用这个方法就ok了!
啰嗦了这么多其实这个很简单。
假如还有不明白的童鞋 请看右下角 本人提供特殊服务。。。。。
.Net、WPF 技术交流群 : 9234450
点击加入QQ群:
不管你遇到了什么问题,我们绝不会让你独自去面对!
Winform之跨线程访问控件(在进度条上显示字体)的更多相关文章
- C#WinForm解决跨线程访问控件属性报错
方式一(在程序初始化构造函数中加一行代码): public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCal ...
- winform跨线程访问控件
首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性.所以除了控件所在的线程外的线程调用会抛异常 (Cross-thread operation not va ...
- C# WinFrom 跨线程访问控件
1.跨线程访问控件委托和类的定义 using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summ ...
- c#使用MethodInvoker解决跨线程访问控件
功能函数测试集锦(77) C#专区(114) 版权声明:本文为博主原创文章,未经博主允许不得转载. .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线 ...
- C# 关于跨线程访问控件问题
跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有.在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理.因此,当没有使用委托 ...
- C# 跨线程访问控件(MethodInvoker)
参考:https://www.cnblogs.com/lvdongjie/p/5428815.html .Net 通常禁止跨线程访问控件,设置Control.CheckForIllegalCrossT ...
- c# winform InvokeRequired 解决跨线程访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...
- C# WinForm 跨线程访问控件
问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框: 解决方案: 方案一:去掉线程访问主线程UI控件的安全检查,使用: Control.CheckFor ...
- C#之Winform跨线程访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...
随机推荐
- Android网络请求心路历程
HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...
- powerdesigner简单使用
---- 1) --- 新建流程图:新建模型,选择activity的那个就可以了. ----
- tlplayer,wzplayer支持wince,winphone,windows8 for arm
tlplayer,wzplayer宣布支持wince,winphone,windows8 for arm,支持http,hls,rtmp,rtsp,mms等媒体流协议. 支持加密视频播放. 目前tlp ...
- bzoj3796
好像已经很久没有做后缀数组的题目,导致这种题一开始没想出来看到公共子串肯定想到后缀数组吧,但我都忘了最长公共子串怎么求了重要的性质:最长公共子串=max(h[i])名次相邻的两个后缀要分别属于s1,s ...
- keychain中我的证书与证书, p12与pem, apns, 推送
如果在A电脑上生成 的apns, 到B电脑上导入此文件时, 在 "我的证书"中找不到, 要去"证书"才能找到, 因为 创建时的csr不是本机生成的. 那这样的话 ...
- 知识面 z
http://blog.csdn.net/sxhelijian/article/details/23163683 有了较宽和知识面,面对复试中不知道的问题,回答可以是:“这个问题,直接回答我没有把握, ...
- 分别应用include指令和include动作标识在一个jsp页面中包含一个文件。
分别应用include指令和include动作标识在一个jsp页面中包含一个文件. hello.jsp <%@ page language="java" import=&qu ...
- SR4000笔记
长时间运行情况下需要有降温处理(40度以下) 建议使用触发模式而非连续模式 850nm波长的光(虽然无害,建议不要直视) 12V DC 滤波镜头(允许24个LED激光波长的通过) 快闪:获取数据 慢闪 ...
- [POJ1852]Ants
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12431 Accepted: 5462 Description An a ...
- VS2013 MVC Web项目使用内置的IISExpress支持局域网内部机器(手机、PC)访问、调试
VS2013内置了IISExpress.做asp.net MVC的web项目开发时,Ctrl+F5和F5启动项目运行(后者是调试模式)的同时都会打开IISExpress,事实上本机对该web项目走的就 ...