退出vbscript会终止前台线程

时间:2014-07-18 13:26:11

标签: c# multithreading vbscript interop

我有一个项目,提供一个人在编写vbscript文件时可以使用的互操作库(例如从自定义数据源导入数据)。

在一个特定的调用中,底层的c#库启动一个线程来写入事件数据。我们希望数据是异步写入的(这是出于不同的原因;互操作库只使用事件写入功能)并将线程创建为Foreground线程,以防止进程终止直到它们完成。

问题是当运行* .vbs文件时,进程将运行完成并退出。正在进行的任何前台线程在完成之前终止。

当* .vbs文件完成正常的预期行为时,是否会终止前台线程?

我还在c#控制台应用程序中重现了该场景,该应用程序以Environment.Exit(0)终止,它将前台线程关闭为正常行为。使用return语句退出控制台应用程序只允许在所有前台线程终止后终止。

1 个答案:

答案 0 :(得分:1)

.NET框架负责在主线程退出(通常)时等待那些前台线程,而不是通过强制终止进程而等待您找到的。

VBScript对于这个特定的东西没有这样的框架,至少不会处理或了解从它使用的COM对象构造的.NET线程。

因此,VBScript完全没有注意到你的主题,并且在它认为正确的时候会很乐意推翻这个过程,而这反过来会强制终止你的主题。

有几种方法可以解决这个问题:

  1. 向您的VBScript代码添加内务处理调用,该代码将通知COM对象该进程即将终止,以便这些COM对象有机会通过终止这些线程并刷新任何待处理数据来正确清理。
  2. 将COM对象更改为不使用线程并同步写入/刷新所有数据。
  3. 组合1.和2.以这种方式使您的VBScript代码可以专门要求这些COM对象使用线程,因此必须通知它们终止,将COM对象默认为同步行为,除非另有说明。