none
C# WinForm 异步执行 RRS feed

  • 问题

  • 点击查询时窗体会死机.等到查询完了数据显示在DataGridViwer中才活过来.请问如何解决这个问题.学习了!

    2010年8月10日 15:10

答案

  • 你好

    或者你可以嘗試用 BACKGROUNDWORKER 做一個THREAD 來 處理查询數據的動作,

    這樣点击查询时窗体便不会死机了, 你亦都可以 顯示一些字/圖來給用戶知道 查詢數據中...ETC

    BACKGROUNDWORKER 的詳細資料可以參考以下URL

    http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx

    Please correct me if my concept is wrong


    Chi
    2010年8月10日 15:53
    版主
  • namespace WindowsFormsApplication1
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
            public delegate void Delegate1();
            public delegate void Delegate2(DataTable dt);
            public void buttonFind_Click(object sender, EventArgs e)
            {
                Delegate1 d1 = new Delegate1(Find);
                d1.BeginInvoke(new AsyncCallback(AsyncCallback1), d1);
            }
            public void AsyncCallback1(IAsyncResult iAsyncResult)
            {
                Delegate1 d1 = (Delegate1)iAsyncResult.AsyncState;
                d1.EndInvoke(iAsyncResult);
            }
            public void Find()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("name", typeof(string));
                dt.Columns.Add("age", typeof(int));
                AddRow(dt, "张三", 19);
                AddRow(dt, "张三", 19);
                AddRow(dt, "李四", 18);
                this.Invoke(new Delegate2(Bind2), new object[] { dt });
            }
            public void AddRow(DataTable dt, string name, int age)
            {
                DataRow dr = dt.NewRow();
                dr["name"] = name;
                dr["age"] = age;
                dt.Rows.Add(dr);
            }
            public void Bind2(DataTable dt)
            {
                this.dataGridView1.DataSource = dt;
            }
        }
    }

    2010年8月11日 13:52

全部回复

  • 你好

    或者你可以嘗試用 BACKGROUNDWORKER 做一個THREAD 來 處理查询數據的動作,

    這樣点击查询时窗体便不会死机了, 你亦都可以 顯示一些字/圖來給用戶知道 查詢數據中...ETC

    BACKGROUNDWORKER 的詳細資料可以參考以下URL

    http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx

    Please correct me if my concept is wrong


    Chi
    2010年8月10日 15:53
    版主
  • 你可以开启一个线程来完成数据加载,然后同步界面

    这个可以很好的避免界面的阻塞。

    同步界面时候主要要用委托来回调,否则会报错。


    family as water
    2010年8月11日 1:39
  • namespace WindowsFormsApplication1
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
            public delegate void Delegate1();
            public delegate void Delegate2(DataTable dt);
            public void buttonFind_Click(object sender, EventArgs e)
            {
                Delegate1 d1 = new Delegate1(Find);
                d1.BeginInvoke(new AsyncCallback(AsyncCallback1), d1);
            }
            public void AsyncCallback1(IAsyncResult iAsyncResult)
            {
                Delegate1 d1 = (Delegate1)iAsyncResult.AsyncState;
                d1.EndInvoke(iAsyncResult);
            }
            public void Find()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("name", typeof(string));
                dt.Columns.Add("age", typeof(int));
                AddRow(dt, "张三", 19);
                AddRow(dt, "张三", 19);
                AddRow(dt, "李四", 18);
                this.Invoke(new Delegate2(Bind2), new object[] { dt });
            }
            public void AddRow(DataTable dt, string name, int age)
            {
                DataRow dr = dt.NewRow();
                dr["name"] = name;
                dr["age"] = age;
                dt.Rows.Add(dr);
            }
            public void Bind2(DataTable dt)
            {
                this.dataGridView1.DataSource = dt;
            }
        }
    }

    2010年8月11日 13:52