2013-06-05 47 views
4

如果我在C#線程中啓動IronPyThon引擎,python腳本將啓動一些線程。但是,當我殺死C#線程時,python腳本中的所有線程仍在運行。我怎樣才能殺死Python腳本中的所有線程?停止在IronPython中運行的所有線程

+2

請顯示您的代碼 - 你如何啓動引擎,你如何試圖殺死它 – MikroDel

+0

你真的想殺死**所有**線程?然後就退出這個過程;) – quetzalcoatl

+0

你如何「殺死」線程?通常不建議使用'Thread.Kill'​​方法。搜索SO的原因(例如[這裏](http://stackoverflow.com/q/5034538/21567))。 –

回答

5

簡單的理念將開始它作爲一個Process

你殺Process它的每一個Thread也將被殺死之後。

+2

+1:不知道IronPython解釋器在被強制取出時究竟做了什麼或者不做什麼,這很可能是最穩健的方式。也許在單獨的應用程序域中運行它也可能是足夠的,但很難說。 –

0

如果你確定要殺死它們,你所做的就是遍歷進程列表並檢查每個進程的父ID。如果父ID與您啓動的IronPython進程的ID相同,則將其殺死。這將殺死與該進程相關的所有線程。像這樣的事情,其中​​的過程是過程和家長的全陣列是你開始IronPython的過程:

private static void killProcessAndChildProcesses(Process[] processes, Process parent) 
{ 
    foreach (Process p in processes) 
    { 
     if (p.GetParentProcessId() == parent.Id) 
     { 
      p.Kill(); 
     } 
    } 
    parent.Kill() 
} 

如果你擔心孩子IP處理自己的產卵過程中,您將需要轉換這成了一個遞歸的解決方案。

0
  1. 如果你的線程循環在每次迭代執行的東西,你可以設置一個揮發性布爾標誌(因爲我不熟悉Python僞代碼),使得它在完成當前迭代後退出:

    while shouldExit = false 
    // do stuff 
    
  2. 然後,只要將該標誌設置爲true,當您希望線程停止時,它將在下次檢查條件時停止。 如果您不能等待迭代完成並需要立即停止迭代,則可以使用Thread.Abort,但要確保無法保留打開的文件句柄,套接字,鎖或其他任何類似的內容不一致的狀態。

0

你可以肯定地以相反的方式做到這一點。由於我不知道Python,我只會分享這個想法。

  • 設置系統(使用的是Windows,它在C#很簡單,搜索Mutex
  • 份額名爲事件與蟒蛇主線程
  • 在主命名事件的名稱蟒蛇線程設置一個終止標誌,訪問由工人蟒蛇線程
  • 組工作的Python線程來監視這個標誌occasionaly
  • 在主線程蟒也開始像下面
  • 設置無限循環在C#線程指定的事件,只要你想讓他們死

僞代碼:

while (Not(isNamedEventSet) && otherThreadsStillBusy) 
{ 
    // Do some magic to check the status of the event 
    isNamedEventSet = ... 

    // rest for a while, 
    // there is nothing better than a nap while other threads do all the hard work 
    Sleep(100) 
} 

我已經做了類似的場景C#/ C++和它一直在所有情況下成功至今。我希望它適合蟒蛇雖然..