2013-03-18 137 views
0

我寫了一個C#程序通過backgndWorkerEnroll_DoWork這反過來又通過一個線程調用另一個函數來調用一個函數。第一次啓動線程後,該功能正常工作。我然後使用thread.Abort()方法終止線程並再次調用thread.Start()方法。前面的函數調用仍然有效,但不會中止。我如何強制關閉線程?線程終止在C#

public int capture() 
{ 
    System.Threading.Thread thEnroll = new System.Threading.Thread(delegate() 
    { 
     // winbio.OpenSession1(); 
     refresult1 = winbio.Enroll1(finger, false, refresult); 
     //winbio.Enroll1(finger, false, refresult, out refresult1); 
    }); 

    thEnroll.Name = "thEnroll"; 
    thEnroll.Start(); 
    while (true) 
    { 
     if (!thEnroll.IsAlive) 
      break; 
    } 
    thEnroll.Abort(); 
    return result; 
} 

private void backgndWorkerEnroll_DoWork(object sender, DoWorkEventArgs e) 
{ 
    capture(); 
} 

還有一個query.how強制關閉backgroundDo_Work通過按鈕單擊事件。

+3

這不是一般的工作,指紋讀取器將幾乎總是被埋沒非託管代碼中,等待司機吐的東西了。像這樣的代碼不能被中止,只有託管代碼可以被CLR安全地中斷。你將需要一個單獨的進程,你可以殺死()。 – 2013-03-18 12:17:33

+0

是什麼在等待,直到線程是死點(嘗試)殺呢?你爲什麼要在可能需要幾秒鐘的操作上進行spinlock? – MattW 2013-03-18 12:28:59

+0

高度相關:[如何停止無響應的線程?](http://stackoverflow.com/questions/11798080/how-to-stop-a-non-responsive-thread/11798203#11798203)...短版本:'Thread.Abort'受到了阻礙,你無法真正相信它離開你的應用程序域的狀態。找到另一種方式。 :P – cHao 2013-03-18 12:51:53

回答

3

現在看來似乎並沒有得到你的中止行動,因爲你有無限循環:

while (true) 
{ 
    // This will run forever 
    if (!thEnroll.IsAlive) 
     break; 
} 

這個循環從精加工阻塞線程。
也是你的植入似乎不可思議,如果線程是不是還活着,你不必放棄它..

+7

豈不的Thread.join()做同樣的,因爲他與他的while循環嘗試? – 2013-03-18 12:20:49

+0

@lorenzalbert我同意。 – 2013-03-18 12:49:42

0

我沒那麼熟悉multithreading,所以糾正我,如果我錯了......但是,從我明白的是,一旦Thread已被中止,它不能再次啓動。這也許可以解釋你所遇到的行爲(EI正常工作的第一次,但不是thread停止firt時間後)

我一派thread.abortthread.joinsee this

如果調用之間的區別Thread.Join取而代之的是,線程將exit很好,而不是投擲ThreadAbortedException該網站還表示,在您致電abort後,您還應該致電join或處理ThreadAbortedException來做到這一點。