2017-07-29 78 views
-1

我不確定這裏發生了什麼。如果我做線程無法運行,除非等待

Task.Run(() => 
     { 
      System.Windows.MessageBox.Show("abc"); 
      Thread.Sleep(5000); 
     }).Wait(); 

這將正常執行和程序工作正常等,但如果我這樣做

Task.Run(() => 
     { 
      System.Windows.MessageBox.Show("abc"); 
      Thread.Sleep(5000); 
     }); 

什麼也沒有發生!

在第二種情況下線程不啓動。我使用visual studio,我做的最後一件事是在異步方法上工作,然後intellisence崩潰或什麼。從那時起,除非我等待它,否則我無法在自己的應用程序中啓動一個新線程,從而破壞了目的。

如果我嘗試像在不同的項目中的第一種情況下啓動線程,它工作正常。

任何人有一個想法什麼是錯的?

編輯:好的我在窗體上做了一個新按鈕並添加了一個單擊事件。我把這個代碼在一個新的方法在不同的類:

Task.Run(() => 
     { 
      MessageBox.Show("abc"); 
     }); 

當從一個類由新按鈕的事件處理函數調用它工作正常。

但是,如果我從舊按鈕調用相同的方法,它不會觸發,儘管按鈕事件本身觸發。因此,在該按鈕的事件處理程序方法中創建的線程不會運行...

那麼我想解決它。

+4

我覺得這很難相信。你確定這不僅僅是你的應用程序在任務實際開始之前完成了嗎?請提供證明問題的[mcve]。 –

+0

當視覺工作室崩潰時,通過按鈕的「屬性」窗口設置的按鈕的單擊事件未正確設置。當你重新啓動時,代碼保持不變,但按鈕。 'button.Click + = new EventHandler(button_Click);'沒有。幾次發生在我身上。 –

回答

-1

可以啓動多個線程,並等待這樣的結尾:

var thread1 = Task.Run(() => 
    { 
     System.Windows.MessageBox.Show("abc"); 
     Thread.Sleep(5000); 
    }); 
var thread2 = Task.Run(() => 
    { 
     System.Windows.MessageBox.Show("def"); 
     Thread.Sleep(5000); 
    }); 
Task.WaitAll(thread1, thread2); 

要小心,所有線程完成正常無異常。

+0

我不明白這與所問的問題有什麼關係...... –

0

當您使用Task.Run就像創建一個新的將在theread池中運行的theread。我的意思是線程將在後臺執行。 因此,您需要一些東西來阻止主線程,就像您使用命令等待來自任務類一樣。