将GUI控件放在不同的线程上?

时间:2010-03-01 05:10:56

标签: c# multithreading user-interface controls

我认为可能会这样做,因为像谷歌浏览器这样的程序已经更好了,并将每个选项卡放在一个单独的进程中。 那么如何将一个GUI控件(如datagridview)放在一个单独的线程上呢?

3 个答案:

答案 0 :(得分:0)

这不是单独线程中的控件,而是通过控件启动的请求。

假设您在不同的地址上打开了两个标签。您单击指向第一个选项卡上另一个站点的链接。同时,您单击第二个选项卡上的另一个链接。

首先,您需要知道在单击第一个选项卡上的链接时可能会启动一个线程,从而使GUI响应。当您单击其中的链接时,这与第二个选项卡相同。

其次,我们现在有一个线程(主线程,也称为GUI线程),其工作是处理用户交互。另一个线程处理来自第一个选项卡上的链接的请求,以及来自第二个选项卡上链接的另一个线程。

第三,虽然正在处理您对这两个标签的链接请求,但您可以说打开一个新标签并在Google上进行搜索!然后,这需要您的GUI响应,即使应用程序,浏览器占用您的请求。

第四,在后台线程返回时,他们将返回主线程报告其工作结果,即他们获得的Web响应请求解决链接点击链接的DNS。

在C#中实现这一目标并使其尽可能简单的有趣方法是通过BackgroundWorker类。

BackgroundWorker的每个实例代表一个线程。因此,当用户单击链接时,您需要实例化应用程序在捕获鼠标单击时所需的BackgroundWorker。然后,该请求将发送到DoWork()事件,该事件是在调用RunWorkerAsync()方法时引发的。

Here's an interesting tutorial了解如何使用BackgroundWorker

答案 1 :(得分:0)

这篇Microsoft文章大致解释了Windows资源管理器如何完成您的要求:

http://msdn.microsoft.com/en-us/library/ms741870.aspx#multi_browser

每个顶级窗口基本上都有一个线程,该窗口的所有事件都在同一个线程上触发。

答案 2 :(得分:-1)

我不认为你需要一个线程用于每一个控件,否则你将拥有大量线程,然后你可能会遇到各种各样的麻烦。

以下是几个可以帮助您入门的网站: http://www.albahari.com/threading/

http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx