2015-04-03 70 views
0

我想同時運行一個函數或同時運行函數A和B,具體取決於相應的複選框c_Ac_B是否被chcecked。我還想通過按停止按鈕來停止所有(一個或兩個)運行功能。我試過下面的代碼。當只有一個chceck盒子被刪除時,它就會被啓動。當chceckboxes被chcecked時,只有函數A運行。當我按下停止按鈕時,運行功能不會停止。同時運行更多功能

private void Start_Click(object sender, EventArgs e) 
     {  
     ThreadStart ts_A = delegate() 
       { 
       }; 
       if (c_A.Checked) 
       { 
        t_A = new Thread(ts_A); 
        t_A.Start(); 
        function_A(); 
       } 

        ThreadStart ts_B = delegate() 
       { 
       }; 
       if (c_B.Checked) 
       { 
        t_B = new Thread(ts_B); 
        t_B.Start(); 
        function_B(); 
       } 
     } 

     private void Stop_Click(object sender, EventArgs e) 
     { 
      t_A.Abort(); 
      t_B.Abort(); 
     } 
+0

您的'ts_A'和'ts_B'指向空的代表。這沒有任何用處。如果你想在相應的線程中調用'function_a'和'function_b',然後在這些委託中包裝一個調用語句。 – 2015-04-03 05:40:55

+1

請不要**在線程中調用Abort(),除非您正在關閉應用程序。否則調用它是危險的。請閱讀以下內容:http://stackoverflow.com/a/1560567/259769 – Enigmativity 2015-04-03 06:04:00

+0

請參閱[「應該在其標題中包含」標籤「的問題嗎?」](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles),其中共識是「不,他們不應該」! – 2015-04-03 06:43:29

回答

1

你根本沒有在線程中調用你的方法。你實際上是從線程中調用它。

爲了在線程中調用它,應該在ThreadStart中傳遞該方法。

ThreadStart ts_A = new ThreadStart(function_A); 

然後調用t_A.Start會在線程中運行function_A。你可以在這裏找到更多關於ThreadStart的信息https://msdn.microsoft.com/en-us/library/system.threading.threadstart%28v=vs.110%29.aspx

說了這麼多,你的方法應該看起來像這樣。

private void Start_Click(object sender, EventArgs e) 
    {  
    ThreadStart ts_A = new ThreadStart(function_A); 
      if (c_A.Checked) 
      { 
       t_A = new Thread(ts_A); 
       t_A.Start(); 

      } 

       ThreadStart ts_B = new ThreadStart(function_B); 
      if (c_B.Checked) 
      { 
       t_B = new Thread(ts_B); 
       t_B.Start(); 

      } 
    } 
+0

非常感謝。 – kamila 2015-04-07 19:30:37