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;

}

这样就解决了窗体死机的现象;

如果大家还有更好的方法,我们一起讨论

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇...

30390
来自专栏圣杰的专栏

Parallel线程安全问题

废话不多说,上代码: using System; using System.Collections.Generic; using System.Threadin...

33150
来自专栏GreenLeaves

控制反转和依赖注入模式

一、控制反转和依赖注入两者搭配能像反射工厂那样解决程序集之间的耦合问题,下面将从Asp.Net经典的三层模式多方位的讲解控制反转和依赖注入模式,是如何帮我们进行...

193100
来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-使用UDA操纵SQL语句

       上一篇文章基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义中对本案例所涉及的数据表及部分数据,本文开始将从最基本的业务,数...

21650
来自专栏智能大石头

老瓶装新酒 - C#调用WM手机发送短信(源码)

一些系统,需要能够发送短信,量很小,平均每日10条。 运营商平台太贵,白名单很严格,小额只能发省内; 各短信平台有各种限制,大事件前后会关闭; 飞信以前可以用W...

25050
来自专栏Kiba518

C#线程安全使用(四)

这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来。

9430
来自专栏大内老A

Enterprise Library Policy Injection Application Block 之三:PIAB的扩展—创建自定义CallHandler(提供Source Code下载)

本系列的第一部分对PIAB使用场景进行了简单的介绍,作中阐述了通过PI(Policy Injection)的方式实现了Business Logic和Non-Bu...

351100
来自专栏Create Sun

mvc+webapi 单元测试 3.使用Moq模拟AspnetMvc中的Request.Form

 1.前言     现在这个项目已经有阶段性的模块完成了,所以就想着对这些模块进行单元测试,以保证项目的代码的质量。首先虽然标题是mvc+webapi实质上我只...

64690
来自专栏jessetalks

由浅入深表达式树(完结篇)重磅打造 Linq To 博客园

  一个多月之后,由浅入深表达式系列的最后一篇终于要问世了。想对所有关注的朋友说声:“对不起,我来晚了!” 希望最后一篇的内容对得起这一个月时间的等待。在学习完...

46660
来自专栏岑玉海

WF追忆

  前一阵子学习了一下工作流,现在写个总结记录一下这个过程。要弄工作流,首先就要有个界面来画图,做web的,没办法,只能选择javascript和silverl...

29360

扫码关注云+社区

领取腾讯云代金券