当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-25

    本文导语:  异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码 首先按习惯的方法,设定线程更新UI a2.CheckForIllegalCrossThreadCalls = false;  //a2为窗体名称 下面的代码就是从数据...

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

首先按习惯的方法,设定线程更新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;
        }           

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • struts+spring+hibernate+jquery实现分页功能的几个基本类介绍(异步加载)
  • Linux 中关于异步函数的问题
  • java异步方法调用框架 asyn4j
  • 异步消息传递框架 Errai
  • Web服务器/前端 iis7站长之家
  • 异步I/O库 libeio
  • 异步 JS 工具 Async.js
  • 异步JS开发库 Wind.js
  • 异步JS开发库 Jscex
  • JS异步编程库 WinJS
  • 异步connect的问题,27日18:00前结账。
  • ACE linux下的异步IO
  • unix下异步进程的问题
  • 请问单线程异步机制的优势在哪里?
  • Node.js 异步错误处理 LAEH2
  • 纯异步的Server简单实现 Server
  • 内核进程间发送信号用哪个函数,如果没有这东西,那内核里异步通知用哪个东西
  • PHP异步执行技巧分享
  • Swift 异步编程库 Wyrd
  • 异步网络编程框架 itachi
  • C++异步网络开发库 ez_poll


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3