2010-03-12 77 views
3

我使用VB.NET的web應用程序,它開始使用的CreateObject一些過程,就像這樣:過程中獲取進程ID開始的CreateObject在.NET

Dim AVObject = CreateObject("avwin.application") 

所有步驟完成後得到的一切關閉停止使用正確的釋放功能,但由於某些原因,該過程仍然存在。

是否有某種方式可以獲得已啓動進程的進程ID,以便在終止之前明確地終止它?

感謝

回答

2

我從來沒有碰到過一個具體的解決這個問題,但在邏輯上我會用下面的僞邏輯(我想應該在受控環境中工作)創建一個解決方法

  • 包住在的CreateObject說CustomCreateObject(...)
  • 在下面的方法實現相同的順序
  • 呼叫System.Diagnostics.Process.GetProcessesByName(nameOfYourProcess),存儲所有的進程ID
  • 呼叫的CreateObject(...)
  • 呼叫GetProcessesByName再次和現在得到進程ID的新列表
  • 進程ID,它是在後來的列表,而不是在第一位,將是一個你是後。返回,以便呼叫者知道要監視的進程ID。
+0

這聽起來不錯,但是,它是非常可能的腳本將在不同的線程運行的同步。 – 2010-03-15 11:48:05

+0

只要你把這些代碼放在一個關鍵部分(鎖)中作爲一個原子操作並集中你所有的應用程序創建,那麼它應該是線程安全的 – 2010-03-15 12:14:37

+0

好吧,這聽起來不錯。你有任何關於如何在VB中創建關鍵部分的建議(語法上我的意思是)? – 2010-03-15 12:37:08

1

畢竟一切都結束了,停止使用正確的釋放功能,但由於某些原因,過程依然存在。

你試過強制一個GC還是叫做ReleaseCOMObject()方法?

最佳

阿德里亞諾

+0

謝謝,也許我會試試這個。我已經實施了Fadrain的建議,這是可行的。 – 2010-03-18 07:47:17

+0

我試過這種方法,它不會停止進程.. – 2010-03-18 14:23:06

+0

有趣。當COM服務器的引用計數下降到零時應該去。也許你有一些其他的對象引用它? 如果您在實例化組件(不調用組件中的任何方法/屬性)後立即調用ReleaseCOMObject()會發生什麼? – Vagaus 2010-03-18 15:17:17