好的。我环顾了一些尝试线程我的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线程中。
现在问题的解决方案是没有动画滚动条滚动条的“请稍候”对话框。
将检查是否有办法为此创建一个单独的应用程序来填充此钱包,因为这似乎是唯一的解决方案。
您的问题可能是每个控件都是在UI线程上进行的底层工作 - 控件是否加载自己的数据,并且这是在UI线程上完成的? – driis
在没有看到您的代码的情况下对此进行诊断非常困难。很明显,你的代码正在做一些事情来支持UI线程。你需要找出它是什么并将它移动到后台线程。 –
这些生成的控件中的每一个都有一些数据被加载。但正如我所说,我试图从背景工作者生成和应用这些控制。不应该加载这个数据由后台处理程序处理?无论如何,因为这些控件被调用到了UI上,所以还是要用它来获取UI? –