C#线程等待UI对话框
本文关键字:对话框 UI 等待 线程 | 更新日期: 2023-09-27 18:09:24
好的。我环顾四周,有些人试图将我的UI线程化以使其发挥作用。
我有一个申报信息的申请。这是如何工作的,我一个用户控件,可以在滚动区重复。因此,如果一天要加载10个报告,它将在可滚动区域中加载此控件20次。
我想要的是在加载这些控件时制作一个"请稍候"对话框。但是线程UI似乎有一个问题,因为Marquee模式下的进度条在绘制这些应该位于后面可滚动区域的控件时不会动画化。
我曾尝试在后台工作程序中生成控件,但当涉及到进度条时,这并不能解决问题。
当涉及到线程UI绘图时,有什么想法或技巧吗?我想这就是它的样子。progressbar同时绘制其他控件。
编辑:我尝试将此"请稍候"对话框同时显示为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线程进行某种后台处理(导致延迟(。不幸的是,只有一个UI线程,所以如果它被捆绑在一起,就会产生停滞的效果。
如果您有权访问代码,您可以将其更改为异步加载,从而避免此问题。如果你没有访问权限,我能想到的唯一解决方案是启动另一个进程,该进程将有一个单独的UI线程(我认为(,但这需要创建一个消息框样式的窗口。