2011-09-20 85 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