2011-12-26 29 views
2
public class Program 
{ 
    static void Main(string[] args) 
    { 
     var myThread = new TestThread(); 
     Thread t = new Thread(new ThreadStart(myThread.PrintName)); 
     Thread t1 = new Thread(new ThreadStart(myThread.PrintType)); 
     t.Start(); 
     t1.Start(); 
     Console.Read(); 
    } 
} 

public class TestThread 
{ 
    public void PrintName() 
    { 
     for (int i = 1; i <= 50; i++) 
     { 
      Console.WriteLine("Name {0}", i); 
     } 
    } 

    public void PrintType() 
    { 
     for (int i = 100; i <= 180; i++) 
     { 
      Console.WriteLine("Type {0}", i); 
     } 
    } 
} 

这里我怎么能修正它显示,我可以生成输出顺序,即 名称的第一个输出,然后只有输出的类型...我想知道关于在线程中使用锁定()?我在哪里可以得到很好的例子。我是线程初学者,需要v.simple的例子。我们如何运行两个线程并行?

回答

1

你可以看一下this

有多种其他物品,只是谷歌的介绍线程C#“。

0
//This will run two operation in sequence. 
public class TestThread 
{ 
    public object obj = new object(); 
    public void PrintName() 
    { 
     Monitor.Enter(obj); 
     for (int i = 1; i <= 50; i++) 
     { 
      Console.WriteLine("Name {0}", i); 
     } 
     Monitor.Exit(obj); 
    } 

    public void PrintType() 
    { 
     Monitor.Enter(obj); 
     for (int i = 100; i <= 180; i++) 
     { 
      Console.WriteLine("Type {0}", i); 
     } 
     Monitor.Exit(obj); 
    } 
} 
1

线程的目的是为了让事情同时发生。如果你想把事情陆续发生(即顺序),那么就不要使用线程:

var obj = new TestThread();  
obj.PrintName(); 
obj.PrintType(); 
Console.Read(); 

或者把PrintName和平面广告类型在同一个线程,以保持UI响应:

var myThread = new TestThread(); 
Thread t = new Thread(new ThreadStart(
    () => { 
     myThread.PrintName(); myThread.PrintType(); 
    } 
)); 
t.Start(); 
// Do things in the UI meanwhile 
for (i = 0; i < 100; i++) { 
    Console.WriteLine("UI thread {0}", i); 
} 
Console.Read(); 
1

试试这个:

var myThread = new TestThread(); 
var x=Task.Factory.StartNew(() => myThread.PrintName()); 
x.ContinueWith(p => PrintType()); 
x.Wait(); 
0

这将这样的伎俩,您应仔细阅读并尝试通过自己与3个回路做到这一点:

private static void SimpleLockTest() 
     { 
      Task[] myTasks = new Task[2]; 
      myTasks[0] = Task.Factory.StartNew(() => 
      { 
       LockTestThreadOne(); 
      }); 
      myTasks[1] = Task.Factory.StartNew(() => 
      { 
       LockTestThreadTwo(); 
      }); 
      Task.WaitAll(myTasks); 
      Console.WriteLine("Done, press ENTER to quit"); 
      Console.ReadLine(); 
     } 

     private static object locker = new object(); 
     private static void LockTestThreadOne() 
     { 
      Monitor.Enter(locker); 
      for (int i = 1; i <= 50; i++) 
      { 
       Console.WriteLine("Name {0}", i); 
       Monitor.Pulse(locker); 
       Monitor.Wait(locker);      
      } 
      Monitor.Exit(locker);    
     } 

     private static void LockTestThreadTwo() 
     { 
      Monitor.Enter(locker); 
      for (int i = 100; i <= 180; i++) 
      { 
       Console.WriteLine("Type {0}", i); 
       Monitor.Pulse(locker); 
       Monitor.Wait(locker, 10);      
      } 
      Monitor.Exit(locker); 
     } 
相关问题