none
window form: 關於UI 凍結直至program完成 RRS feed

  • 一般討論

  • 以下是code:

    我曾經用了backgroundworker , 但UI還是等待datagridview完成了插入data的工作才解凍,試了很多的方法都不行,可以怎樣才令UI不會凍結之餘而程式照常運作?

     

     private void SearchToolStripButton_Click(object sender, EventArgs e)
        {
          Thread t = new Thread(new ThreadStart(StartMethod));
          t.Start();
        }
        public void StartMethod()
        {
          this.BeginInvoke(new UpdateNow(SearchData));
        }
    
        public void SearchData()
        {
    
          if (searchKeywordTextBox.Text == "")
          {
            MessageBox.Show("Please type the keyword!");
          }
          else
          {
            if (searchDateTimePicker.Checked == true)
            {
              switch (selectRangeComboBox.Text)
              {
                case "Day": showDataToresultDataGridViewOnDay(searchKeywordTextBox.Text);
                  break;
                case "Month": showDataToresultDataGridViewInMonth(searchKeywordTextBox.Text);
                  break;
                case "Year": showDataToresultDataGridViewInYear(searchKeywordTextBox.Text);
                  break;
                default: MessageBox.Show("Please select a Section");
                  break;
              }
            }
            else
            {
              showDataToresultDataGridView(searchKeywordTextBox.Text);
            }
    
          }
        }
        public void showDataToresultDataGridViewOnDay(string keyword)
        {
          DataGridView dayGrid = resultDataGridView;
          ShowResultDay day = new ShowResultDay();
          resultDataGridView.DataSource = day.ShowGridDay(searchDateTimePicker.Value.Day, searchDateTimePicker.Value.Month, searchDateTimePicker.Value.Year, keyword);
          resultLabel.Text = "Showing " + resultDataGridView.RowCount + " records in " + searchDateTimePicker.Value.Day + "/" + searchDateTimePicker.Value.Month + "/" + searchDateTimePicker.Value.Year;
        }
        public void showDataToresultDataGridViewInMonth(string keyword)
        {
          DataGridView monthGrid = resultDataGridView;
          ShowResultMonth month = new ShowResultMonth();
          resultDataGridView.DataSource = month.ShowGridMonth(searchDateTimePicker.Value.Month, searchDateTimePicker.Value.Year, keyword);
          resultLabel.Text = "Showing " + resultDataGridView.RowCount + " records in " + searchDateTimePicker.Value.Month + "/" + searchDateTimePicker.Value.Year;
        }
        public void showDataToresultDataGridViewInYear(string keyword)
        {
          DataGridView yearGrid = resultDataGridView;
          ShowResultYear year = new ShowResultYear();
          resultDataGridView.DataSource = year.ShowGridYear(searchDateTimePicker.Value.Year, keyword);
          resultLabel.Text = "Showing " + resultDataGridView.RowCount + " records in " + searchDateTimePicker.Value.Year;
        }

     

    2011年5月22日 下午 04:11

所有回覆

  • 你的Thread啟動的Method中看起來應該不會執行很久, 怎麼會出現UI凍結 ?

    有幾種可能的解決方式

    (1) 加上Thread.Sleep  方法以暫時釋放資源

    (2) 使用SuspendLayout與ResumeLayout方法讓畫面更新不要做太多次動作

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月22日 下午 04:34
    版主
  • 因為我是從database 讀出data的,主要是當gridview.datasource 放入資料時需時比較長,有沒有方法可以在放資料到gridview時UI仍能正常運作?
    2011年5月22日 下午 05:44
  • 程式碼看起來沒有用到 Background Worker...

    在執行這種程式時,如果 UI 動作太多的話,會讓 UI 更新的動作變遲緩,才讓你覺得有凍結的感覺,這種更新 UI thread 的動作無法使用 Multithreading 來處理 (除非 UI 本身就有 Multithreading 的能力),你只能試著降低 UI 動作的量 (ex: 減少 DataSet 的筆數)。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    2011年5月23日 上午 12:41
    版主
  • Hi, 你可以參考看看這篇技術文章:[C#][WinForm]UI別在無回應了

    2011年5月23日 上午 03:43
  • 因為我是從database 讀出data的,主要是當gridview.datasource 放入資料時需時比較長,有沒有方法可以在放資料到gridview時UI仍能正常運作?

    可能要請你測試一些問題.

    (1)  day.ShowGridDay, month.ShowGridMonth, year.ShowGridYear 以你的程式碼看起來這三個Method都是執行從資料庫取得資料, 你可以先測試一下這三個Method要多久時間才能把資料抓完

    (2) 如果以上三個Method的時間很長, 建議你不要直接將DataSource指向這些Method, 你應該先宣告三個Dataset(還是DataTable? 或其它) 在StartMethod中先取得這三個Method的結果, 而在showDataToresultDataGridViewOnDay直接將三個DataGridView的DataSource指向其結果即可, 因為這樣才不會在Invoke的過程中去執行資料庫I/O的動作.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月23日 上午 04:03
    版主
  • 其實最慢的不是從DB拿出來,因為我用LINQ,最慢的是從linq放資料入到gridview的時候最慢導致UI 凍結,我想解決的就是這個問題....

     

    2011年5月23日 上午 05:52
  • 其實最慢的不是從DB拿出來,因為我用LINQ,最慢的是從linq放資料入到gridview的時候最慢導致UI 凍結,我想解決的就是這個問題....

     

    那試著在你那三個和DataGridView的Method中, 最前面加上this.SuspendLayout(); , 最後加上this.ResumeLayout(); 試試看有沒有用.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月23日 上午 07:39
    版主
  • 沒有用,依然是會停止
    2011年5月24日 上午 07:52
  • 有多少筆資料 ?有幾個欄位 ? 因為如果發生這種現象, 感覺應該是有不少資料筆數?
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月29日 下午 12:00
    版主