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

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

这个是批量的将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. [Quick-x]制作新手引导高亮区域方法之二:裁剪模式

    demo下载:https://github.com/chenquanjun/Quick-x-HighlightArea 2.裁剪模式 (1)创建裁剪对象 , , ) --非高亮区域颜色 local b ...

  2. IPv6 tutorial – Part 8: Special addresses

    https://4sysops.com/archives/ipv6-tutorial-part-8-special-addresses/ The special IPv6 addresses disc ...

  3. 应付发票审批 Hold and Release Names

    (N) AP > Setup > Invoice > Hold and Release Names 这里一般默认就可以了.Use the Invoice Hold and Relea ...

  4. ERP 及相关名词的含义

      英文缩写 英文名称 中文含义 MRP Material requirements planning 物料需求计划 MRP II Manufacturing resource planning 制造 ...

  5. 将Sublime Text3添加到右键菜单中

    卸载了Sublime Text2,安装了最新版本的Sublime Text3,不过一直不在右键菜单中,每次使用都需要从打开方式中选,所以决定添加,有如下2种方法. 添加到右键菜单 方法一(推荐) 在S ...

  6. CSS属性一览

    CSS 属性 CSS 属性组: 动画 背景 边框和轮廓 盒(框) 颜色 内容分页媒体 定位 可伸缩框 字体 生成内容 网格 超链接 行框 列表 外边距 Marquee 多列 内边距 分页媒体 定位 打 ...

  7. hihocoder #1289 : 403 Forbidden (2016 微软编程笔试第二题)

    #1289 : 403 Forbidden 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi runs a web server. Sometimes ...

  8. C# 6和 VB 12的最新特性列表

    随着下个版本的C#发布日逐渐临近,那些还没有完成的特性必须被砍掉.最近从特性列表中被砍掉的特性包括主要构造函数(primary constructor)和声明表达式(declaration expre ...

  9. 浅谈 HTML5 的 DOM Storage 机制 (转)

    在开发 Web 应用时,开发者有时需要在本地存储数据.当前浏览器支持 cookie 存储,但其大小有 4KB 的限制.这对于一些 Ajax 应用来说是不够的.更多的存储空间需要浏览器本身或是插件的支持 ...

  10. 基于DDD的现代ASP.NET开发框架--ABP系列之3、ABP分层架构

    基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:ht ...