2012-02-15 14 views
2

我有一個使用Microsoft Windows API代碼包的C#應用​​程序 - 特別是Shell Extensions,我用它來監視存儲設備和介質插入,去除。使用Windows API代碼包的C#應用​​程序Shell Extension不會關閉

但是,當我嘗試關閉Visual C#2010(Express)中的應用程序時,我必須手動停止調試器。看起來Win API代碼包中有一個後臺循環仍在運行,即使我手動處理了ShellObjectWatcher。我可以殺死它的唯一方法是手動停止調試器。

該應用程序是在WPF中構建的。

最終,VisC#2010放棄嘗試在調試器下運行應用程序。你告訴它開始調試,但它沒有。只有這樣才能讓它再次發揮作用,就是使用任務管理器關閉應用程序,然後關閉VC#2010 - 去喝杯咖啡 - 然後重新啓動它。奇。我懷疑當我嘗試清理應用程序時,有一個隱藏的進程或窗口掛着,並且沒有關閉。

任何想法如何可以更有效地清理這個ShellObjectWatcher?

+0

我沒有看到「ShellObjectWatcher」類,什麼版本? Shell接口總是具有COM線程親和力,請務必僅從WPF或Winforms應用程序中的[STAThread]使用它們。如果你不這樣做,那麼COM將啓動一個線程來爲該對象提供一個線程安全的主頁。 – 2012-02-15 14:20:00

+0

它是Windows API代碼包1.1的一部分 它似乎掛在代碼包內的messagelistener線程方法上。 – Mark 2012-02-15 15:41:57

+0

我也碰到過這個。具體來說,MessageListener.ThreadMethod()在一個while(_running)內部有一個阻塞調用,所以如果Dispose()試圖通過設置_running來結束線程,它將不會響應。當然,這不是。所以這些MessageListener線程永遠不會被清理。如果它是一個後臺線程,這會很好,但事實並非如此。您可以在MSFT自己的ShellObjectWatcherSampleWPF上看到相同的行爲。 – MNGwinn 2012-09-14 16:15:54

回答

2

修復bug的代碼包殼牌項目,在MessageListener.WndProc()添加一行:

case (uint)WindowMessage.Destr​oy: 
**_running = false;** 
break; 

現在ThreadMethod()將退出消息循環。

1

確定使用System.Environment.Exit(0);修復此問題。應用程序關閉,調試器釋放控制權。蠻力在這種情況下起作用。

0

我碰到了同樣的問題,但通過設置線程爲後臺線程解決它(意思是,它被殺死的應用程序停止時):

MessageListener.cs

,在構造函數中,第40行,我有:

_windowThread = new Thread(ThreadMethod); 
// The line below will force the thread to terminate when the app exits. 
_windowThread.IsBackground = true; 
_windowThread.SetApartmentState(ApartmentState.STA); 
相關問題