gpt4 book ai didi

c# - 将两种形式作为不同的线程运行(或至少 2 种形式运行 "parallel")

转载 作者:行者123 更新时间:2023-11-30 13:06:33 27 4
gpt4 key购买 nike

我想执行以下操作 (c#)

  • 我有一个Form,我们叫Form1
  • Form1 创建 Form2
  • Form2 的构造函数被执行(GUI、变量..)。 Form2 的最后指令是:创建并显示 Form3
  • Form2 包含 Label1
  • Form2 创建 Form3 并将其自身的引用传递给 Form3
  • Form3 多次编辑(Form2 的)标签 1(假设 100 次)

没关系..一切正常但是..问题是:Form3 需要很长时间才能运行所有操作(假设为 10 秒)。最后(同时)显示 Form2 和 Form3,但我希望 Form2 在 Form3 之前可见,因为我想要哪个,而执行 Form3 操作(包括在 Form2 上编辑 label1)时,Form2 显示 Label1 的每次更新(如“正在做:操作 1”,然后是“正在做:操作 2”等等……)。

我还尝试在 Form2 上制作一个按钮 (Button1),定义 Button1_onClick() 事件并使用“创建并显示 Form3”来实现其内容。但是当我单击 Button1 时,Form2“消失”(就像当 Windows 应用程序被阻止并且它变得“暂停”时)并且它在出现 Form3 的同一时刻仅显示最终标签(“操作:100”)。

我的问题总结:--> 我有 3 个表单

  • Form1
  • Form2(带有 Label1)
  • Form3(在 Form2 中编辑 Label1)

--> 应该发生什么:

  • Form1 创建并显示 Form2
  • Form2 创建并显示 Form3
  • Form3 进行各种操作(如创建列表、排序等),并针对每个操作更新 Form2 中的 Label1(并且用户必须看到更新过程)

所有 Form2 操作都是从 Form2 的构造函数中调用的函数调用的,例如:Form2_Constructor() => 调用 makeOperations()--> makeOperations() => 调用 Operation1(),然后是 Operation2(),最后是 Operation3(),其中每个 OperationX() 都包含一个循环(比如说 30 次迭代),执行一些操作并调用 Form2.setLabel1("Operation Name");

我的想法(如标题所说)是制作两个不同的线程.... 或者至少找到一种方法让两个表单以“并行模式”运行(这样当 Form3 执行操作时 Form2 不会空闲)。

知道如何解决这个问题吗?

最佳答案

如果您真的想要两个不同的表单在不同的线程上运行,那么您将需要创建另一个线程,该线程通过 Application.Run 运行消息循环。但是,不建议使用这种方法。它会导致奇怪的问题,并且使两种不同的形式相互访问变得不方便,因为从一种形式到另一种形式的所有访问都需要使用 Control.Invoke 进行编码(marshal)处理。

我建议坚持使用单个 UI 线程。将当前由 Form3 执行的长时间运行的代码尽可能多地放入工作线程。随着工作线程取得进展,您可以慢慢地将结果发布到 Form3。可以通过以下两种方式之一将结果发布到 Form3

  • 通过调用 InvokeBeginInvoke 让工作线程将结果推送到 Form3
  • Form3 轮询共享数据结构以获取工作线程发布的结果

那些监视我的答案的人已经知道我要推荐哪一个:UI 线程轮询结果的后一种方法。它具有以下优点。

  • 它打破了 Control.Invoke 强加的 UI 和工作线程之间的紧密耦合。
  • 它将更新 UI 的责任放在 UI 线程上,无论如何它都应该属于这个地方。
  • UI 线程可以决定更新的时间和频率。
  • 不存在 UI 消息泵溢出的风险,而工作线程启动的编码(marshal)处理技术会出现这种情况。
  • 工作线程不必等待执行更新的确认就可以继续执行后续步骤(即,您在 UI 和工作线程上获得更多吞吐量)。

如果当前由 Form3 执行的工作不能轻易地转移到工作线程(也许它大部分时间都在操作 UI 控件,这只能从托管表单的 UI 线程完成)然后您将需要放慢执行此工作的速度,以便让表单有更多时间响应用户输入。这意味着你将被迫做出一些牺牲。例如,您可能需要一次只填充一百行,而不是用数千行填充网格,并提供某种分页行为,允许用户移动到下一个一百行。

关于c# - 将两种形式作为不同的线程运行(或至少 2 种形式运行 "parallel"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410309/

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