Winform 的一个多线程绑定DataGrid数据源的例子
1/ Thread thread=new Thread(new StartThread(this.method))
thread.start();
2/ define delegate
public delegate void MethodDelegate();
instance delegate
MethodDelegate md=new MethodDelegate(this.method)
md.BeginInvoke();
在winform程序下我们经常遇到在做查询的时候,当查询数据特别多的时候就会出现界面停滞的现象,不能做任何其他事情,只能等待这个查询完成;这时我们自然想到了要运用多线程技术;来解决这个问题
我的代码结构是
dbmanager.readTable(string table,string express):DataTable 查询数据库返回一个DataTable(时间就浪费在这里);
QueryFrm 查询窗体 有一些条件的输入,还有一个DataGrid做现实
一般的做法
private void Query()
{
string express =" where 1=1";
DataTable dt=dbmanager.ReadTable("table",express);
dataGrid.DataSource=dt;
}
尝试用委托来做
public delegate DataTable QueryDelegate(string table,string express);
private void Query()
{
string express =" where 1=1";
QueryDelegate querydelegate=new QueryDelegate(dbmanager.ReadTable)
querydelegate.BeginInvoke("table",express,new AsyncCallback(QueryCompeled),querydelegate);
}
private void QueryCompeled(IAsyncResult ar)
{
try{
QueryDelegate querydelegate=(QueryDelegate)ar.AsyncState;
DataTable dt=querydelegate.EndInvoke(ar);
dataGrid.DataSource=dt;
}
catch(Exception e)
{
Console.Write(e);//这种做法会报错,提示+ ex {"Controls created on one thread cannot be parented to a control on a different thread." } System.Exception
}
}
这种错误网上一查多的是网上也有多说法,
有人可能会想到使用窗体的BeginInvoke来调用,后来发现这种做法是并不能做到异步调用,仍然会造成死机的现象
后来我找一个变通的方法
public delegate DataTable QueryDelegate(string table,string express);
public delegate void QueryCompleted(DataTable dt);
private void Query()
{
string express =" where 1=1";
QueryDelegate querydelegate=new QueryDelegate(dbmanager.ReadTable)
querydelegate.BeginInvoke("table",express,new AsyncCallback(QueryCompeled),querydelegate);
}
private void QueryCompeled(IAsyncResult ar)
{
try{
QueryDelegate querydelegate=(QueryDelegate)ar.AsyncState;
DataTable dt=querydelegate.EndInvoke(ar);
object[] arg=new object[];
arg[0]=dt;
QueryCompleted qc=new QueryCompleted (this.BindResult);
this.BeginInvoke(qc,arg);
}
catch(Exception e)
{
Console.Write(e)
}
}
private void BindResult(DataTable dt)
{
dataGrid.DataSource=dt;
}
这样就解决了窗体死机的现象;
如果大家还有更好的方法,我们一起讨论
Winform 的一个多线程绑定DataGrid数据源的例子相关推荐
- .Net平台Winform两个ComboBox控件绑定同一个数据源
今天WINFROM编程遇到这么一个问题:是有关WINFORM中两个comboBox控件绑定同一个数据源的问题,在窗体的界面上有两个comboBox,我在Form1_Load中对他们做了数据绑定(具体代 ...
- wpf DataGrid主从表,DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017
wpf DataGrid主从表,DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017 . 子表绑定 ...
- Nexus.js介绍:一个多线程的JavaScript运行库
首先,如果你不熟悉这个项目,建议先阅读之前写的一系列文章.如果你不想阅读这些,不用担心.这里面也会涉及到那些内容. 现在,让我们开始吧. 去年,我开始实现Nexus.js,这是一个基于Webkit/J ...
- chart绑定mysql数据源_MSChart图表之Chart组件 学习一篇(5个主要属性+数据源绑定)...
前沿:简单练习效果---- 一.5大属性简介: 整个图形控件主要由以下几个部份组成:1.Annotations --图形注解集合 2.ChartAreas --图表区域集合 3.Legends --图 ...
- Repeater绑定ArrayList数据源
Repeater绑定ArrayList数据源 就相当与把ArrayList的数据绑定到Repeater的ItemTemplate 上 就是RepeaterItem等于ArrayList的一项例如 Me ...
- ASP.Net绑定Sql数据源用echarts图表来展示数据
ASP.Net绑定Sql数据源用echarts图表来展示数据 这里我们需要先学会ajax请求和网页的echarts图的使用 不会的同学也没关系可以看我接下来的内容我会一步步的来讲解的 首先大家可以先从 ...
- python 多线程 类_Python中如何自定义一个多线程类呢?
摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...
- oracle into多个变量,Oracle中merge into的使用:该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据....
该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,ins ...
- 用 python 实现一个多线程网页下载器
今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...
最新文章
- 直接对梯度下手,阿里达摩院提出新型优化方法,一行代码即可替换现有优化器...
- 《数学之美》第23章 布隆过滤器
- centos7 rpm安装MySQL
- peleenet测试
- 直播预告 | 旷视科技李彦玮:动态网络及其在场景分割中的应用
- 数据仓库/集市 星形/雪花形 事实/维度表
- apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)
- linux中修改字符编码
- Spring事务那些事儿
- java mariadb 使用,java连接mariaDB的设置,java连接mariadb
- 太棒了!港大同济伯克利推出目标检测新范式:Sparse R-CNN
- python开发环境有哪些特点_快速了解Python开发环境Spyder
- bzoj2595 [Wc2008]游览计划
- R语言CRAN软件包Meta分析 1
- JavaScript的封装方法
- GDKOI2021普及组滚粗记
- 美化 PowerShell
- 怎样转载csdn文章
- 让你高效工作的7大工具类网站
- HashMap 为什么是2倍扩容