你的位置:首页 > ASP.net教程

[ASP.net教程]C#中线程的用法



通过委托的方式创建线程


 

static int sum(int x)

{

return x+x;

{

Func<int> a = sum;

创建一个新的线程格式:a.BeginInvoke(10);

获取一个线程的返回值:IAsyncResult ar = a.BeginInvoke(10,null,null);  

  //第二种方法 IAsyncResult ar = a.BeginInvoke(10,OnCallback,a);

  //第三种方法,使用lanmba表达式,例如:

    /* IAsyncResult ar = */ a.BeginInvoke(10,ar=>

    {

      int res = a.EndInvoke(ar);

      Console.WriteLine(res);

    },null)

  第一个null参数代表回调函数,例如:

    static void OnCallback(IAsyncResult ar)

    {

      第二个null参数是回调函数传递的数据,例如:

      Func<int> a = ar.AsyncState as Func<int>;  // 把ar.AsyncState类型转换为Func<int>类型的对象

    }

获取线程返回值的状态:ar.IsCompleted的返回值true为线程结束,false为线程还未结束。

获取线程的执行的结果:int res = a.EndInvoke(ar);

 


用Thread创建线程

创建线程:Thread t = new Thread(Function);  // Function为需要启动一个新的线程来执行的函数

启动线程:t.Start();  // 如果Function有参数(必须是Object类型),则Function的参数由Start函数来传递

获取线程ID:Thread.CurrentThread.ManagedThreadId

 

也可以自己写一个类,例如:

class MyThread

{

  private string fileName;

  private string filePath;

  public MyThread(string filename,string filepath)

  {

    this.fileName = filename;

    this.filePath   = filepath;

  }

  public void DownFile(string filename,string filepath)

  {

    Console.WriteLine("正在下载:"+filepath+filename);

    ......

    Console.WriteLine("下载完成");

  }

}

在program中调用

MyThread myt = new MyThread("filename","filepath");

Thread t = new Thread(myt.Down);

t.Start();

设置后台线程的方法,例如:t.IsBackground = true;

线程分为前台线程与后台线程,后台线程会伴随着前台线程的结束而被强制结束

强制终止一个线程:t.Abort();

优先执行的线程:t.Join();  // 暂停当前程序,先执行t.Join()然后再执行当前未执行完的线程

 

C#中的线程池

C#中已经封装好了一个线程池ThreadPool,在双核的条件下默认1023个工作线程,和1000个I/O线程。所有线程为后台线程

调用线程池的方法:ThreadPool.QueueUserWorkItem(Function);  // Function为自定义函数,这个函数要有一个object类型的一个参数

 像一个正在运行的线程加锁的用法:lock(加锁的对象);