2014-12-23 75 views
0

我在WPF中有一個窗口,用戶可以在其上啓動非常長的操作。用戶必須能夠取消這些操作。關閉所有的子線程WPF

我所有的操作都在不同的線程中。所以我的問題是: 我可以在任何時候終止從該窗口啓動的所有線程,而不會明顯中斷UI線程嗎?

在哪裏,我需要做長期的經營場所線程創建並啓動這樣

Thread thread = 
      new Thread(
       new ThreadStart(
        delegate 
        {...})); 
     thread.Start(); 

如何該對象傳遞給它?可能嗎?如果它非常重要,我不關心優雅地關閉線程,它們可以被殺死,它仍然是一個解決方案。窗口對象是否知道它是父對象的線程?

預先感謝您。

+0

你如何開始線程? – 3dGrabber

+2

http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource%28v=vs.110%29.aspx – xxbbcc

+5

請參閱[取消託管主題](http://msdn.microsoft.com /en-us/library/dd997364%28v=vs.110%29.aspx) –

回答

0

通常你不想創建/銷燬線程。每次創建線程時,在線程池和任務中創建線程所需的開銷要比線程池和任務時多(如果需要在進程的生命週期中創建大量的線程,就像指定一樣)。

首選方法(特別是如果您使用.Net 4.0,甚至更好4.5)是使用任務。

關於如何使用任務以及如何取消它們有大量的文檔。 @xxbbcc在你的問題的評論中發佈了一個鏈接。

但是,如果您仍然認爲處理線程是您的最佳選擇,那麼您可以跟蹤所有線程。然後,無論您(作爲開發人員)還是您的用戶確定他們想要殺死該線程,都可以遍歷這些線程並在其上調用Abort()方法。

public class MyExampleClass 
{ 
    private List<Thread> MyThreads { get; set; } 

    public MyExampleClass() 
    { 
    MyThreads = new List<Thread>(); 
    InstanciateThreadsWithSomeSuperImportantOperations(); 
    } 
    private void InstanciateThreadsWithSomeSuperImportantOperations() 
    { 
    var thread = new Thread(); 
    // some code here 

    MyThreads.Add(thread); 
    } 

    public void KillAllThreads() 
    { 
    foreach (var t in MyThreads) 
    { 
     if (t.IsAlive)   
     t.Abort(); // Note this isn't guaranteed to stop the thread. 
    } 
    } 
} 
+2

[不推薦'請放棄'](http:// stackoverflow .com/questions/27561976/check-if-thread-finished-its-method-before-killing-it-c-sharp/27562048#27562048) –

+0

使用中止或其他方法是另一個問題。當然,我可以創建一個線程列表並殺死它們,而且看起來我必須這樣做。 這實際上是我的問題 - 我可以做到這一點,而無需手動觀看正在運行的線程(它們已停止,將它們從列表中刪除等)。 當然,如果我可以做到這一點沒有我的代碼 – Rouz

+0

@SriramSakthivel我試圖不建議使用線程的所有,但我沒有看到另一種方式殺死線程。 – Cameron