我试图找出一种方法让用户控件在他们自己的 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 上。