【发布时间】:2008-09-19 23:28:24
【问题描述】:
我试图找出一种方法让用户控件在他们自己的 UI 线程中运行。这可能吗?我正在尝试防止基于模块的应用程序由于单个模块而崩溃。
有什么想法吗?
【问题讨论】:
-
如何在各自独立的应用程序域中运行每个模块。不知道该怎么做,但应该可以,对吧?
我试图找出一种方法让用户控件在他们自己的 UI 线程中运行。这可能吗?我正在尝试防止基于模块的应用程序由于单个模块而崩溃。
有什么想法吗?
【问题讨论】:
这是不可能的。但是,对于一些重要的代码,您可以在不同的线程中运行不同的窗口。每个窗口都有自己的消息循环。
更新:
您可以想到的另一种方法是以特殊方式编写控件。您可以通过创建一个运行所有逻辑的新线程来处理控件中的所有事件。
【讨论】:
很遗憾,所有 UI 控件都在同一个 UI 线程上运行。因此,在此线程上运行的任何可能导致挂起情况的代码都需要使用某种超时逻辑进行编码。
DateTime startTime = DateTime.Now;
while(DateTime.Now.Subtract(startTime).TotalSeconds < 30)
{
//do something
}
否则,正如 Orlangur 之前所说,所有事件处理程序代码都需要在单独的线程中运行。但是,您仍然需要监视这些线程以确定它们是否运行时间过长并关闭它们。因此,您最好实现上述类型的逻辑,因为它的工作量会少得多,而且更易于维护。
【讨论】:
我想这不是程序崩溃的问题。当然可以捕获异常,但问题在于挂起控件。针对这种情况,举个例子:
public void Button1_Click(object sender, EventArgs args)
{
while(true) {}
}
如果此代码在控件中运行,则不会引发异常,但会挂起。我正在尝试确定一种方法来捕获它并从应用程序中删除控制模块。
【讨论】:
应该可以在不同的线程中运行控件。一点黑客攻击和 Windows 覆盖,它应该是可行的。
我认为您可以在另一个线程中创建一个 GUI 控件,然后使用 win api SetParent 将其移动到一个公共窗口(主 gui 线程)。 SetParent 可用于“劫持”其他窗口,因此您应该能够以这种方式获取控件。但当然可能存在焦点问题和其他问题,但可能是可行的。
我曾经用它把我自己的按钮放到 MS Messenger 上。
【讨论】: