2013-10-10 84 views
1

我用C#編寫的代碼:C# - 多線程

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program re = new Program(); 
      re.actual(); 
     } 
     public void actual() 
     { 
      Thread input = new Thread(input_m); 
      Thread timing = new Thread(timing_m); 
      input.Start(); 
      timing.Start(); 
     } 
     public void input_m() 
     { 
      Console.WriteLine("Choose a number from 1-10 (You have 10 seconds): "); 
      Console.ReadKey(); 
     } 
     public void timing_m() 
     { 
      System.Threading.Thread.Sleep(10000); 
      input.Abort(); 
      Console.Clear(); 
      Console.WriteLine("Time's up!"); 
      Console.ReadKey(); 
     } 
    } 
} 

現在,我得到這個錯誤:

Error 1 The name 'input' does not exist in the current context 

它說,有關「input.Abort(); 「線。

我可以以某種方式從另一個方法終止此線程(而不是從它創建的地方)?

我不想讓它們成爲靜態的,所以請不要這麼說。

+2

Thread.Abort的()是真的真的[衰](http://stackoverflow.com/questions/710070/timeout-pattern-how-bad-is-thread-abort - 當然)... – Chris

+0

'控制檯'塊。 –

回答

3

您需要使用類字段而不是局部變量。

class Program 
{ 
    private Thread input; 
    public void actual() 
    { 
     this.input = new Thread(input_m); 
     //... 
    } 
} 

無關的問題本身,你不應該使用多線程強行中止一個從控制檯讀取。相反,您應該使用Sleep和Console.KeyAvailable屬性的組合。

+0

非常感謝。 我想了解更多關於「this」和class fields的主題。我在哪裏可以瞭解更多關於班級領域以及如何使用它們? – BlueRay101

+0

而且,如果在方法中聲明瞭一個線程,它是一個被認爲是局部變量的線程? – BlueRay101

+0

任何你在form中定義的方法'SomeType variable = something();'被認爲是一個局部變量。 –

1

應該

public void actual() 
    { 
     Thread input = new Thread(input_m); 
     if(input.Join(TimeSpan.FromSeconds(10))) 
        //input complete 
     else 
        //timeout 
    } 
+0

謝謝,但我更喜歡Knagis所建議的方式,因爲它使我能夠更全面地控制線程。 – BlueRay101