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 ...
随机推荐
- java中遍历List中的map问题
List list = new ArrayList();Map map = null; while (rs.next()) { map = new HashMap(); map.put("f ...
- JNI编程(一) —— 编写一个最简单的JNI程序
来自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...
- Case swapping
Case swapping Description: Given a string, swap the case for each of the letters. e.g. CodEwArs --&g ...
- AS 学习笔记 加载数据
AS2 加载本地(外部)数据.swf .png .jpg 等资源使用loadMovie() 加载库里面的mc 用 attachMovie AS3 加载本地(外部)数据 用 Loader 类来完成这个操 ...
- 使用 EPUB 制作数字图书
基于 XML 的开放式 eBook 格式 是否需要分发文档.创建电子图书或者把喜欢的博客文章存档?EPUB 是一种开放式的数字图书规范,以常用的技术如 XML.CSS 和 XHTML 为基础,EPUB ...
- Windows中APACHE开启fastcgi后无法连接数据库
环境:Windows server 2003 x64Apache 2.2.14mod_fcgid-2.2b-w32.zipPHP VC9 x86 Non Thread Safe(用Visual C++ ...
- 第K顺序统计量
1.第K顺序统计量概念 在一个由n个元素组成的集合中,第k个顺序统计量是该集合中第k小的元素.例如,最小值是第1顺序统计量,最大值是第n顺序统计量. 2.求Top K元素与求第K顺序统计量不同 Top ...
- POJ 1773 Parity game 带权并查集
分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...
- HDU 5648 DZY Loves Math 暴力打表
题意:BC 76 div1 1003有中文题面 然后官方题解看不懂,我就不说了,然后看别人的题解 因为询问i,j最大都是15000,所以可以预处理,res[i][j]代表答案,然后显然这是开不下的,也 ...
- Google Code Jam 第一题
通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...