我正在寻找创建一个标签式界面,该界面在选项卡式或MDI界面中具有用户控件(可能由插件开发人员编写)。这些插件控件可能会无意中冻结其GUI线程,我宁愿它们不会影响其他选项卡中的用户控件。就像Google Chrome为每个标签创建一个流程一样;但在这种情况下,只是线程。
或者甚至是子MDI表单的MDI接口都由不同的线程拥有?
我发现虽然我可以同时运行多个GUI线程,但Form级别必须分开。任何变通/想法?
对于那些说不应该这样的人,我称之为废话。出于安全性和用户界面的原因,Google的Chrome浏览器会在不同的流程中运行标签我只是想复制这种行为。当编写用户控件的人是笨重的插件开发人员时,这很重要。
答案 0 :(得分:2)
不能以你描述的方式做到这一点。拥有/关联到另一个GUI线程的控件不能直接包含在一个控件中,该控件以其绘制函数在另一个线程上运行的方式拥有/关联到不同的线程。
答案 1 :(得分:1)
解决此问题的正确方法是编写不在UI线程上执行长时间运行任务的UserControl。如果控件阻塞并等待某些计算任务,请修复 。使该任务在后台运行,并让控件显示一些非计算密集型内容,直到完成为止。如果该任务冻结,控件将被冻结在“我正在等待......”状态,但它不会侵入UI的其余部分。
如果你正在使用第三方控制,你无法修复,好吧,在Jay-Z不朽的话语中,我感觉不好,儿子。
答案 2 :(得分:1)
在大多数情况下,控件不应执行任何处理。它们的目的是提供用户和应用程序之间的交互性。例如,按钮的工作不是从数据库获取数据并将其呈现给用户。话虽如此,希望您在控件事件处理程序中进行处理,例如Button控件上的Click事件。在事件处理程序中,您可以通过在后台线程中处理任务来阻止UI显示为“挂起”。在这些情况下,BackgroundWorker通常很有用。
我建议阅读线程。 The Microsoft® .NET Framework Application Development Foundation本书有一个关于线程的部分(即使没有阅读其他认证书籍,我至少建议所有.NET开发人员阅读本书)。请记住不要从子线程更新UI。如果您不熟悉这种方法,请阅读how to make a thread-safe call to Windows controls上的示例。
答案 3 :(得分:0)
您应该从不同的角度查看整个问题,而不是拥有或拥有不同的GUI线程。为什么要将与tab的子控件关联的线程冻结?如果它确实冻结了,其他一切也都会变得模糊不清,那么从一开始就没有做到这一点。
JaredPar
指出的是正确的,但这并不意味着你无法达到你想要的效果。我假设您希望在选项卡中运行的东西能够继续运行/停止,而不会影响其他控件和用户体验。
我之前在一个复杂的WinForm应用程序中完成了它。以下是一些可能为您提供更多见解的阅读材料:
Threading out tasks in a C#.NET GUI
Thread and GUI
Updating GUI from Other Threads in C#
Advanced Techniques To Avoid And Detect Deadlocks In .NET Apps