【发布时间】:2012-02-12 20:42:37
【问题描述】:
我创建了一个 C# COM DLL,它本质上是一个增强的进度条,在新线程上运行 System.Windows.Forms.Application.Run() 以显示带有对话框的表单。要在使用 VBA 的第三方应用程序中使用它,您可以执行以下操作:
Set pg = CreateObject("MyNS.MyProgressBar")
pg.ShowBar()
.
.
pg.Progress = 0.5
.
.
pg.ShutDownBar()
问题是用户能够在达到 pg.ShutDownBar() 之前关闭应用程序(使用 File->Quit 或类似方法)。如果用户这样做,pg.ShutDownBar() 永远不会被调用,结果是虽然应用程序的窗口被隐藏了,但它仍然出现在任务管理器进程中。
所以我的问题是: 有没有办法检测父应用程序是否已经关闭然后中止c#中进度条的线程?
我已经在启动对话线程的主线程上尝试了 System.Windows.Forms.Application.ThreadExit 和 System.Windows.Forms.ApplicationExit,但是在通过 COM 访问对象时似乎没有引发这些事件(尽管它们当我在 .NET 中创建对象时调用)....
谁能给点建议?
【问题讨论】:
-
听起来像是典型的 DoEvents() 问题。不要使用它。
-
没有代码调用 DoEvents()... 我尝试不使用 Application.Run 在单独的线程上启动我的对话框,而是在单独的线程上使用 form.ShowDialog(),但随后对话框基本上被冻结了......不知道为什么?
-
如果在应用程序退出事件中将进度条对象设置为
Nothing会发生什么?
标签: c# multithreading vba com