c#异步读取数据库与异步更新ui的代码实现

 更新时间:2013年12月09日 10:11:12   作者:  
这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧

异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码

首先按习惯的方法,设定线程更新UI

a2.CheckForIllegalCrossThreadCalls = false;  //a2为窗体名称

下面的代码就是从数据库里取得数据并绑定

复制代码 代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com;
            try
            {
                con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
                con.Open();
                com = new SqlCommand("select top 100 * from tb_user", con);
                com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("程序发生错误,信息: " + ex.Message);
            }

        }

        private void delDataBin(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                SqlCommand com = (SqlCommand)ar.AsyncState;
                SqlDataReader dr = com.EndExecuteReader(ar);
                DataTable dt = new DataTable();
                dt.Load(dr);
                dr.Close();

                this.dataGridView1.DataSource = dt;  //绑定数据           

            }
        }

到这里完成的绑定的工作,运行查看一下效果,其实这样是会出现窗体假死的现象。

下面通过Invoke 来实现

首先声明委托  public delegate void updateDG(DataTable dt);

然后通过dataBin来绑定DataGridView

复制代码 代码如下:

        public void dataBin(DataTable dt)
        {
            dataGridView1.DataSource = dt;
            return;
        } 

在线程里面调用下面方法

复制代码 代码如下:

//绑定数据
                if (this.InvokeRequired)
                {
                    updateDG ur = new updateDG(dataBin);
                    this.Invoke(ur, dt);
                }

完整的代码如下:

复制代码 代码如下:

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com;
            try
            {
                con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
                con.Open();
                com = new SqlCommand("select top 100 * from tb_user", con);
                com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("程序发生错误,信息: " + ex.Message);
            }

        }

        private void delDataBin(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                SqlCommand com = (SqlCommand)ar.AsyncState;
                SqlDataReader dr = com.EndExecuteReader(ar);
                DataTable dt = new DataTable();
                dt.Load(dr);
                dr.Close();

                //this.dataGridView1.DataSource = dt;//绑定数据

                if (this.InvokeRequired)
                {
                    updateDG ur = new updateDG(dataBin);
                    this.Invoke(ur, dt);
                }
            }
        }

        public delegate void updateDG(DataTable dt);

        public void dataBin(DataTable dt)
        {
            dataGridView1.DataSource = dt;
            return;
        }           

查运行查看一下,你就会发现结果了

相关文章

  • C#实现将Word转化分享为电子期刊

    C#实现将Word转化分享为电子期刊

    曾经由一个项目,要求实现制作电子期刊定期发送给企业进行阅读,由编辑人员使用 Microsoft Word先生成PDF文件,然后将生成的PDF文件转化为JPEG文件,最后将JPEG文件生成电子书模式,本文给大家介绍了C#实现将Word转化分享为电子期刊,需要的朋友可以参考下
    2023-12-12
  • C# 窗口过程消息处理 WndProc的方法详解

    C# 窗口过程消息处理 WndProc的方法详解

    在WinForm中一般采用重写WndProc的方法对窗口或控件接受到的指定消息进行处理,本文给大家介绍C#窗口过程消息处理WndProc的方法详解,感兴趣的朋友一起看看吧
    2025-04-04
  • Unity实现简单场景分层移动

    Unity实现简单场景分层移动

    这篇文章主要为大家详细介绍了Unity实现简单场景分层移动,分为前景、场景、背景等,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Unity实现注册登录模块

    Unity实现注册登录模块

    这篇文章主要为大家详细介绍了Unity实现注册登录模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Visual Studio C#创建windows服务程序

    Visual Studio C#创建windows服务程序

    用Visual C#创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Windows服务并使用它,本文主要介绍了Visual Studio C#创建windows服务程序,感兴趣的可以了解一下
    2024-01-01
  • 详解如何在ASP.NET Core配置请求超时中间件

    详解如何在ASP.NET Core配置请求超时中间件

    本文参考官方文档,为大家详细介绍如何使用Asp.net core 8.0 的最小API 模板项目,配置超时中间件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-01-01
  • C#编程中设置程序只可被运行一次的方法

    C#编程中设置程序只可被运行一次的方法

    这篇文章主要介绍了C#编程中设置程序只可被运行一次的方法,包括一种让程序自动重启以限制第二次被运行的方法,需要的朋友可以参考下
    2015-11-11
  • c#生成验证码程序

    c#生成验证码程序

    这篇文章主要介绍了使用c#生成验证码的示例,大家参考使用吧
    2014-01-01
  • C#多线程与异步的区别详解

    C#多线程与异步的区别详解

    多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别
    2017-06-06
  • C#实现将程序锁定到Win7任务栏的方法

    C#实现将程序锁定到Win7任务栏的方法

    这篇文章主要介绍了C#实现将程序锁定到Win7任务栏的方法,涉及C#调用Shell类的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论