此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理  有很好的解决方案(个人认为的。有更好的方案欢迎交流。)

在做跨线程访问之前我们先了解下我们所做的需要达到的效果:

这个是批量的将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之跨线程访问控件(在进度条上显示字体)的更多相关文章

  1. C#WinForm解决跨线程访问控件属性报错

    方式一(在程序初始化构造函数中加一行代码): public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCal ...

  2. winform跨线程访问控件

    首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性.所以除了控件所在的线程外的线程调用会抛异常 (Cross-thread operation not va ...

  3. C# WinFrom 跨线程访问控件

    1.跨线程访问控件委托和类的定义 using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summ ...

  4. c#使用MethodInvoker解决跨线程访问控件

      功能函数测试集锦(77)  C#专区(114)  版权声明:本文为博主原创文章,未经博主允许不得转载. .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线 ...

  5. C# 关于跨线程访问控件问题

    跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有.在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理.因此,当没有使用委托 ...

  6. C# 跨线程访问控件(MethodInvoker)

    参考:https://www.cnblogs.com/lvdongjie/p/5428815.html .Net 通常禁止跨线程访问控件,设置Control.CheckForIllegalCrossT ...

  7. c# winform InvokeRequired 解决跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...

  8. C# WinForm 跨线程访问控件

    问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框:    解决方案:  方案一:去掉线程访问主线程UI控件的安全检查,使用: Control.CheckFor ...

  9. C#之Winform跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...

随机推荐

  1. ActionBar官方教程(10)ActionBar的下拉列表模式

    Adding Drop-down Navigation As another mode of navigation (or filtering) for your activity, the acti ...

  2. 【HDOJ】1756 Cupid's Arrow

    图论,点在多边形内部的判定. /* 1756 */ #include <iostream> #include <string> #include <map> #in ...

  3. 【HDOJ】1462 Word Crosses

    字符串水题,这么做可能比较巧妙. /* 1462 */ #include <iostream> #include <string> #include <map> # ...

  4. C# winform 渐变效果

    在用到vs的兴奋过程中,想给程序做个启动画面,我采用了显示Aform,过一段时间,隐藏这个Aform,showdialog下一个Bform,closeAForm这个方法来做了,不知道大家有没有跟好的办 ...

  5. BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...

  6. 【转】android JNI编程 一些技巧(整理)

    原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...

  7. [Raobin] Ext.net在多重子父窗体中找到当前窗体的父窗体,并关闭IFrame父窗体

    var closeParentWindow = function () { var currentWin = window; while (top != currentWin) { var prent ...

  8. Java&MySQL Type Mapping

    MySQL Type Name Return value of GetColumnClassName Returned as Java Class BIT(1) (new in MySQL-5.0) ...

  9. Java笔记(六)……程序流程控制

    判断结构 三种结构: 1: if(条件表达式) 2: { 3: 执行语句; 4: } 5:  6: if(条件表达式) 7: { 8: 执行语句; 9: } 10: else 11: { 12: 执行 ...

  10. 问题记录:spark读取hdfs文件出错

    错误信息: scala> val file = sc.textFile("hdfs://kit-b5:9000/input/README.txt") 13/10/29 16: ...