首页 > 代码库 > C# 线程问题

C# 线程问题

一:概述和概念

     C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。这里的一个简单的例子及其输出:

    引入的命名空间:
   using System; 
   using System.Threading;

class ThreadTest {
  static void Main() {
    Thread t = new Thread (WriteY);
    t.Start();                          
    while (true) Console.Write ("x");  
  }
  
  static void WriteY() {
    while (true) Console.Write ("y");   
  }
}

 技术分享

     主线程创建了一个新线程“t”,它运行了一个重复打印字母"y"的方法,同时主线程重复但因字母“x”。CLR分配每个线程到它自己的内存堆栈上,来保证局部变量的分离运行。在接下来的方法中我们定义了一个局部变量,然后在主线程和新创建的线程上同时地调用这个方法。

static void Main() {
  new Thread (Go).Start();      // Call Go() on a new thread
  Go();                         // Call Go() on the main thread
}
  
static void Go() {
  // Declare and use a local variable - ‘cycles‘
  for (int cycles = 0; cycles < 5; cycles++) Console.Write (‘?‘);
}

 技术分享

当线程们引用了一些公用的目标实例的时候,他们会共享数据。下面是实例:

class ThreadTest {
 bool done;
  
 static void Main() {
   ThreadTest tt = new ThreadTest();   // Create a common instance
   new Thread (tt.Go).Start();
   tt.Go();
 }
  
 // Note that Go is now an instance method
 void Go() {
   if (!done) { done = true; Console.WriteLine ("Done"); }
 }
}

 因为在相同的<b>ThreadTest</b>实例中,两个线程都调用了<b>Go()</b>,它们共享了<b>done</b>字段,这个结果输出的是一个"Done",而不是两个。

C# 线程问题