我需要能够在第二个UI线程上启动一个窗口,然后再次关闭它。
这是我目前的代码:
/// <summary>Show or hide the simulation status window on its own thread.</summary>
private void toggleSimulationStatusWindow(bool show)
{
if (show)
{
if (statusMonitorThread != null) return;
statusMonitorThread = new System.Threading.Thread(delegate()
{
Application.Run(new AnalysisStatusWindow(ExcelApi.analyisStatusMonitor));
});
statusMonitorThread.Start();
}
else
{
if (statusMonitorThread != null)
statusMonitorThread.Abort();
statusMonitorThread = null;
}
}
AnalysisStatusWindow
是一个相当基本的System.Windows.Forms.Form
上面的代码成功创建了新的UI线程,但忽略了我对Abort
线程的请求。结果是多次切换上述函数只会导致新的窗口打开 - 所有这些都在他们自己的线程上并且完全正常运行。
有什么方法可以将消息传递给此线程以便很好地关闭?如果失败了,有没有办法确保Abort()
真正杀死我的第二个UI线程?
我尝试使用new Form().Show()
和.ShowDialog()
代替Application.Run(new Form())
,但它们并不容易关闭。
如果有人质疑是否需要单独的UI线程,则此代码存在于Excel加载项中,我无法控制Excel UI在计算给定单元格时阻塞的事实。因此,当执行长时间运行的自定义公式时,我需要第二个UI线程来显示进度更新。
答案 0 :(得分:2)
感谢汉斯的评论。我使用以下代码解决了我的问题:
/// <summary>Show or hide the simulation status window on its own thread.</summary>
private void toggleSimulationStatusWindow(bool show)
{
if (show)
{
if (statusMonitorThread != null) return;
statusMonitorWindow = new AnalysisStatusWindow(ExcelApi.analyisStatusMonitor);
statusMonitorThread = new System.Threading.Thread(delegate()
{
Application.Run(statusMonitorWindow);
});
statusMonitorThread.Start();
}
else if (statusMonitorThread != null)
{
statusMonitorWindow.BeginInvoke((MethodInvoker)delegate { statusMonitorWindow.Close(); });
statusMonitorThread.Join();
statusMonitorThread = null;
statusMonitorWindow = null;
}
}