c# - 为什么我的主窗体需要 20 多秒才能可见?
问题描述
我一定遗漏了一些明显的东西,但我根本不明白为什么我的 Windows 窗体应用程序中的主窗体需要 20 秒才能显示出来。我的程序试图采用我在控制台应用程序示例中找到的 TPL 代码示例,并在 Windows 窗体/gui 中运行。我知道任务的排队需要 20 秒才能完成,但是那段代码是否发生得如此之快以至于表单没有时间完成初始化?我尝试在“InitializeComponent();”之后立即延迟 希望它能让表格有时间出现;并且还尝试在之后放置一个消息框,但在我插入延迟后仍然得到相同的延迟。没有 form_load 方法,所以没有什么可以检查的。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Time the test(s)
Stopwatch stoppwatch = new Stopwatch();
stoppwatch.Start();
Console.SetOut(new ControlWriter(tb1)); // just redirects console.writeline to the form's textbox "tb1"
// #################################### job queue ########################################
var q = new TPLDataflowMultipleHandlers(); //
var numbers = Enumerable.Range(1, 10);
foreach (var num in numbers)
{
F1TimeDelay(2);
q.Enqueue(num.ToString());
}
// Stop the timer and return the elapsed number of milliseconds.
stoppwatch.Stop();
Console.WriteLine("XXXXXXXXXX <STATUS> Elapsed time = {0} minutes. XXXXXXXXXX", (int)stoppwatch.Elapsed.TotalMinutes);
}
顺便说一句,当表单最终出现时,文本框充满了我希望从启动的线程中看到的消息(线程 ID 等信息)。
F1TimeDelay(2) 是 2 秒延迟,而排队的作业只是 10 秒长的任务,以演示并行运行的 10 个任务。发送到队列的编号最终成为 10 个任务的作业编号。
解决方案
因为在构造函数和 FormShown 事件之间的某个地方,您正在调用需要 20 多秒才能完成的代码。
虽然我在构造函数中什么都看不到,但这只是加载过程的开始:https ://docs.microsoft.com/en-us/dotnet/framework/winforms/order-of-events-in-windows-形式
通常,您应该检索任何数据或执行其他任何操作的最早时刻是在Shown Event 中。即使这样,像这样的长时间运行的操作也应该通过某种形式的多任务/异步操作来完成。您必须弄清楚它是什么,但我的猜测是磁盘或网络/数据库访问。
如果您希望进行测量并希望得到正确性,则需要在构造函数中启动秒表,并且只在 Shown 中停止/显示结果。即便如此,您的 Shown Event 也可能是第一个被调用的事件,稍后会进行艰苦/长期的工作,因此它可能会错过导致问题的任何原因。您的秒表也不包括设计师创建的元素。Designer 代码使用 InitializeComponents() 执行。当然,在这种数量级的延迟下,定期输出 DateTime.Now 应该是可行的。
推荐阅读
- mocking - 如何修复 sinon.stub().resolves() 抛出 TypeError
不是函数 - python - 使用 [apply(lambda x: x.hour)] 将时间列添加到 DataFrame
- html - 更改背景图像的颜色 (png)
- java - 无法应用 TableColumn 中的 CellValuePropertyFactory
- msp430 - MSP430 cmp.b 指令有什么作用?
- android - 如何从菜单布局中删除圆角,并在项目之间添加线?
- java - 如何使用泛型方法在各种类型的数组中搜索特定变量?
- scala - Scala - List take - OrElse - 具有默认值
- visual-studio - 卡在移动到子目录
- r - 请帮我完成我的统计比例分配