2011-09-20 86 views
1

好的。我環顧了一些嘗試線程我的UI來完成這項工作。C#線程UI用於等待對話框

我有一個報告信息的應用程序。這項工作如何是一個可以在可滾動區域重複的用戶控件。所以如果有一天需要加載10個報表,它將在可滾動區域加載該控件20次。

我想在加載控件時做一個「Please wait」對話框。但是,在繪製這些控件應該位於後面的可滾動區域時,將UI作爲進度條以線框模式運行時不會生成動畫,似乎存在問題。

試圖在後臺工作中生成控件,但是當它涉及到進度條時,它不會解決問題。

任何想法或提示線程UI繪圖? 我想這就是它。進度條,同時繪製其他控件。

編輯: 我試圖顯示這個「請稍候」對話框作爲Show();ShowDialog();。 ShowDialog()可以工作,但只能在它等待答案時暫停其他應用程序。

這是和平的代碼生成控件。這不是背景的線程版本。但唯一的區別是代碼中放置了「pleaseWait」對話框。

 /// <summary> 
    /// Generates assignemts after date 
    /// </summary> 
    /// <param name="date">Date for selection of what to show</param> 
    /// <param name="currentWeek">Week to show</param> 
    /// <param name="igonerWeekCheck">Ignor week check, used for startup</param> 
    private void GenerateAssigmentsAfterDate(DateTime date, int currentWeek, bool igonerWeekCheck) 
    { 
     //refresh UI before generating contens 
     tabPage1.Refresh(); 
     panelScroller.Refresh(); 
     splitContainer1.Refresh(); 

     //freezes UI while loading 
     SuspendDrawing(splitContainer1); 
     panelScroller.SuspendLayout(); 

     if (CurrentTMEngine.LatestWeekNumber != GetWeekNumber(date) || igonerWeekCheck == true) 
     { 
      if (igonerWeekCheck == false) 
      { 
       pleaseWait = PleaseWaitDialog(); 
       pleaseWait.StartPosition = FormStartPosition.CenterParent; 
       pleaseWait.Show(); 
       pleaseWait.Update(); 
      } 

      //should remove current controls from memory 
      int ctrlCount = panelScroller.Controls.Count; 
      for (int i = 0; i < ctrlCount; i++) 
      { 
       panelScroller.Controls[0].Dispose(); 
      } 

      panelScroller.Refresh(); 

      assignmentList.Clear(); 
      assignmentList = null; 
      assignmentList = new List<messageCtrl>(); 

      int rowCountCtrl = 0; 
      foreach (DataRow row in CurrentTMEngine.TMassignmentsTable.Rows) 
      { 
       if (currentWeek == GetWeekNumber(Convert.ToDateTime(row[new TableText().TimeStart]).Date)) 
       { 
        messageCtrl repCtrl = new messageCtrl(rowCountCtrl, Convert.ToInt32(row[new TableText().ID]), 
         Convert.ToDateTime(row[new TableText().TimeStart]), Convert.ToDateTime(row[new TableText().TimeEnd]), 
         panelScroller.Controls, CurrentTMEngine.TMassignmentsTable, row, CurrentTMEngine); 
        assignmentList.Add(repCtrl);//collection to be avalie for show 
        rowCountCtrl++; 
       } 
      } 
      foreach (messageCtrl assign in assignmentList) 
      { 
       if (currentWeek == GetWeekNumber(assign.StartTime.Date)) 
       { 
        if (assign.StartTime.Date == date) 
        { 
         assign.Enabled = true; 
         assign.Height = 142; 
         assign.tableLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlLightLight; 
        } 
        else 
        { 
         assign.Enabled = false; 
         assign.Height = 5; 
         assign.tableLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlDark; 
        } 
        panelScroller.Controls.Add(assign); //ands control 
       } 
      } 
      // SetSizeMessageCtrlByDate(date, currentWeek); 


      pleaseWait.Close(); 
      pleaseWait.Dispose(); 
     } 
     else 
     { 
      SetSizeMessageCtrlByDate(date, currentWeek); 
     } 
     CurrentTMEngine.LatestWeekNumber = GetWeekNumber(date); 

     //unfrezzing UI 
     panelScroller.ResumeLayout(); 
     ResumeDrawing(splitContainer1); 
    } 
    #endregion 

EIDT 2: 似乎與到UI部件的呈現/繪圖。我可以看到這個,因爲我擴展了控制器的這個可滾動區域,所以它們都適合。應用程序凍結,直到用戶界面重新繪製爲滾動條。反之亦然,使其更小。 這似乎是加載控件時發生的凍結類型。所以我猜想,除非有多種UI線程,否則很難找到解決方案,因爲它位於相同的應用程序和此應用程序UI線程中。

現在問題的解決方案是沒有動畫滾動條滾動條的「請稍候」對話框。

將檢查是否有辦法爲此創建一個單獨的應用程序來填充此錢包,因爲這似乎是唯一的解決方案。

+1

您的問題可能是每個控件都是在UI線程上進行的底層工作 - 控件是否加載自己的數據,並且這是在UI線程上完成的? – driis

+0

在沒有看到您的代碼的情況下對此進行診斷非常困難。很明顯,你的代碼正在做一些事情來支持UI線程。你需要找出它是什麼並將它移動到後臺線程。 –

+0

這些生成的控件中的每一個都有一些數據被加載。但正如我所說,我試圖從背景工作者生成和應用這些控制。不應該加載這個數據由後臺處理程序處理?無論如何,因爲這些控件被調用到了UI上,所以還是要用它來獲取UI? –

回答

3

您有權訪問控件的源代碼嗎?這聽起來像是控件使用UI線程來做某種後臺進程(導致延遲)。不幸的是,只有一個UI線程,所以如果它被綁定,你會得到一個拖延效應。

如果您有權訪問代碼,您可以將其更改爲異步加載,以避免此問題。如果你沒有訪問權限,我能想到的唯一解決方案是啓動另一個具有單獨UI線程的進程(我認爲),但是這需要創建一個消息框樣式窗口。

+0

所以你認爲有多個UI線程的可能性? –

+0

@Jonas Lindahi - 我非常確定UI線程不會跨應用程序邊界共享。但是,這涉及運行單獨的應用程序以利用該事實。 – Guvante