gpt4 book ai didi

c# - 用于等待对话框的C#线程UI

转载 作者:行者123 更新时间:2023-12-03 13:21:30 24 4
gpt4 key购买 nike

好的。我环顾了一些试图将我的UI线程以使其工作的方法。

我有一个用于报告信息的应用程序。这项工作的原理是我可以在可滚动区域中重复进行操作的用户控件。因此,如果一天要加载10个报告,它将在可滚动区域中加载此控件20次。

我想要的是在加载这些控件时制作一个“请稍候”对话框。但是,将用户界面线程化似乎是一个问题,因为在选取应位于后面可滚动区域中的这些控件时,在选取框模式下的进度条将无法进行动画处理。

试图在后台工作程序中生成控件,但是在进度条方面无法解决问题。

关于线程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组件的渲染/绘制有关。当我为 Controller 扩展此可滚动区域时,可以看到它们,以便它们都适合。该应用程序将冻结,直到重新绘制UI以使其没有滚动条为止。反之亦然,因为它使滚动更小。
这似乎是加载控件时发生的冻结类型。因此,我想除非有一种方法可以拥有多个UI线程,否则可能很难找到解决方案,因为它位于同一应用程序和此应用程序UI线程中。

目前,该问题的解决方案是没有动画字幕滚动条的“请稍候”对话框。

将检查是否有办法为此创建一个单独的应用程序来填充钱包,因为这似乎是唯一的解决方案。

最佳答案

您可以访问控件的源代码吗?听起来这些控件正在使用UI线程来执行某种后台进程(导致延迟)。不幸的是,只有一个UI线程,因此,如果将其绑起来,则会产生停滞效果。

如果您有权访问代码,则可以将其更改为异步加载,从而避免出现此问题。如果您没有访问权限,我想到的唯一解决方案是启动另一个具有独立UI线程的进程(我认为),但是这将需要创建消息框样式窗口。

关于c# - 用于等待对话框的C#线程UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7490026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com