在Windows窗体中获取多个UI线程
时间:2020-03-06 14:28:13 来源:igfitidea点击:
我试图找出一种使用户控件在自己的UI线程中运行的方法。这可能吗?我试图防止基于模块的应用程序由于单个模块而崩溃。
有什么想法吗?
解决方案
那是不可能的。但是,使用一些非平凡的代码,我们可以在不同的线程中运行不同的窗口。每个窗口都有其自己的消息循环。
更新:
我们可能想到的另一种方法是以特殊方式编写控件。我们可以通过创建将运行所有逻辑的新线程来处理控件中的所有事件。
我想这与程序崩溃无关。当然可以捕获异常,但是问题出在悬挂控件上。为了解决这种情况,下面是一个示例:
public void Button1_Click(object sender, EventArgs args) { while(true) {} }
如果此代码在控件中运行,则不会引发异常,但会挂起。我正在尝试确定一种方法来捕获此错误并从应用程序中删除控制模块。
不幸的是,所有UI控件都在同一UI线程上运行。因此,在此线程上运行的任何可能导致挂起情况的代码都需要使用某种超时逻辑进行编码。
DateTime startTime = DateTime.Now; while(DateTime.Now.Subtract(startTime).TotalSeconds < 30) { //do something }
否则,如Orlangur先前所述,所有事件处理程序代码都需要在单独的线程中运行。但是,我们仍然需要监视这些线程,以确定它们是否运行时间过长并关闭它们。这样一来,我们最好实现上面的逻辑类型,因为它将减少工作量并提高可维护性。