zoukankan      html  css  js  c++  java
  • 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(加锁的对象);

     

     

  • 相关阅读:
    Module build failed: Error: Cannot find module 'node-sass'报错问题
    vue element upload
    vue-element-table 分页选中
    两种倒计时
    【LOJ #6076】「2017 山东一轮集训 Day6」三元组(莫比乌斯反演 / 三元环计数)
    【LOJ #6075】「2017 山东一轮集训 Day6」重建(DP)
    【2020省选模拟】题解
    【LOJ #6074】「2017 山东一轮集训 Day6」子序列(矩阵乘法)
    【LOJ #6073】「2017 山东一轮集训 Day5」距离(主席树 / 树链剖分)
    【LOJ #6072】 「2017 山东一轮集训 Day5」苹果树(容斥 / 搜索 / 矩阵树定理)
  • 原文地址:https://www.cnblogs.com/showonce/p/5073785.html
Copyright © 2011-2022 走看看