Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图使我的windows窗体更轻_C#_Winforms - Fatal编程技术网

C# 试图使我的windows窗体更轻

C# 试图使我的windows窗体更轻,c#,winforms,C#,Winforms,我有一个表单,它包含很多控件,并执行很多交互操作。这导致我的表单在使用过程中出现一些延迟。 其中一个控件是打印工具,它打印从我的服务器接收的大量数据。我考虑将绘图工具移到另一个窗体上,以使窗体更轻,减少延迟问题。我的一个朋友告诉我,这不会有多大帮助,因为它是处理这两个表单的同一个线程,是真的吗 如果在应用程序启动时创建表单(打印工具容器),则启动速度会降低 那么你有两条路: 1)将绘图工具容器移动到新表单,但在需要时创建它(在应用程序启动后) 2)将绘图工具移动到新线程。在这种情况下,您可以将其

我有一个表单,它包含很多控件,并执行很多交互操作。这导致我的表单在使用过程中出现一些延迟。 其中一个控件是打印工具,它打印从我的服务器接收的大量数据。我考虑将绘图工具移到另一个窗体上,以使窗体更轻,减少延迟问题。我的一个朋友告诉我,这不会有多大帮助,因为它是处理这两个表单的同一个线程,是真的吗

如果在应用程序启动时创建表单(打印工具容器),则启动速度会降低

那么你有两条路:

1)将绘图工具容器移动到新表单,但在需要时创建它(在应用程序启动后)

2)将绘图工具移动到新线程。在这种情况下,您可以将其移动到另一个窗体中,并通过新线程创建它。所以如果你用这个 这样你的起步速度就会提高


从给出的答案开始

我刚刚尝试了代码,并对其进行了轻微修改以使其更清晰:

static void Main()
{
    Thread t1 = new Thread(Main1);
    Thread t2 = new Thread(Main2);

    t1.Start();
    t2.Start();

    t1.Join();
    t2.Join();
}

static void Main1()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

static void Main2()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form2());
}

我可以说它是有效的,因为我尝试在其中一个窗体中使用Thread.Sleep(),而第二个窗体gui没有锁定。

你朋友所说的是正确的,但在这里不太可能适用。当一个窗体有很多控件时,它会显得迟钝。当它需要重新绘制自身时,您将开始注意每个控件绘制自身所花费的时间。通常,当窗体有大约50个控件时,会发生这种情况,但这在很大程度上取决于控件的类型。例如,按钮非常昂贵,而标签则不然。您的绘图可能很昂贵,因此在绘图之后绘制的任何内容(Z顺序较高)都将延迟。尝试右键单击控件,然后单击“置于前面”,使其最后绘制

无论你做什么,永远不要像你想象的那样做出剧烈的改变,而不知道你会改进你的计划。这需要先测量。您需要一个探查器来了解cpu周期的消耗位置。分析绘画代码并不是那么容易,因为它不会经常执行。这是可以修复的,请修改表单构造函数,使其如下所示:

    public Form1() {
        InitializeComponent();
        Application.Idle += new EventHandler((s, ea) => this.Invalidate());
    }

您的表单现在燃烧100%核心,一遍又一遍地重新绘制自己。但在其他方面,它仍然完全起作用。这正是有效分析绘图代码所需的。

尝试查看此处是否意味着如果我使用Application.Run打开第二个表单,它将使用新线程?!我只写了一条评论,没有回答,因为我不知道他到底是什么意思。这是相当混乱的,因为我不能尝试这样的代码,我没有足够的信心来陈述一个明确的解释。我建议你试着看看会发生什么,也许用一个更简单的场景来证明这个概念。正如你在评论中看到的那样,这个答案似乎以一种自信的方式被接受了。顺便说一句,我不明白为什么他创建了两个连接的线程,然后只调用应用程序。只运行一个表单。当您调用应用程序时,它是否应该工作。在第二个应用程序上运行?TryIt不是有延迟的开始时间,延迟发生在反应的形式导致一些用户动作。hmmmm。。。我尝试在不使用Application.Run、form.showdialog()的情况下执行相同的操作,但得到了与您相同的结果!!这是否意味着每个表单都有自己的线程!?!我回到了我提出这个问题的第一点,原来的答案是关于“信息泵”。是的,我们每个表单都有一个线程,每个线程都将处理来自操作系统的消息,并保持UI独立运行。通常,当您在UI线程上运行一个繁重的例程时,UI会被锁定,因为它不会立即返回,也不会给表单处理消息的机会。这就是为什么这类东西应该在不同的线程上运行(有几个选项可以实现这一点)。无论如何,自从您谈到表单控件以来,这似乎是实现的最简单的解决方案。Application.Run()直到表单关闭后才会返回。因此,如果不使用两个不同的线程,就不能同时运行两个不同的窗体。当然,如果您实例化第一个线程中的第二个,然后显示它,那么您可以这样做,但是消息pumps将被链接到同一个线程上,当其中一个被卡在例程上时,将导致锁定。