• c#多线程随记回顾


    C#多线程随记回顾

    1.创建多线程方式知道的有三种:

     ---手动创建Thread、使用线程池、使用task任务

    ---手动创建Thread,分两种带参数和不带参数的帮助委托器

    eg:  //帮助器委托不带参数

            //    ThreadStart ts = new ThreadStart(DoWork)

            //    for (int i = 1; i <= 3; i++)

            //    {

            //        Thread t = new Thread(ts);

            //        t.Name = "线程"+i.ToString() ;

            //        t.Start();

            //    }

            //    Console.Read();

      eg://帮助器委托带参数

                ParameterizedThreadStart ts = new ParameterizedThreadStart(DoWork);

                for (int i = 1; i <= 3; i++)

                {

                    Thread t = new Thread(ts);

                    t.Name = "线程" + i.ToString();

                    t.Start(5);            }

                Console.Read();

    -------回调方法:

    //委托

    f = new FDeletate(Fibonacci);

                AsyncCallback callback = new AsyncCallback(Display);//回调委托

                int n = Convert.ToInt32(Console.ReadLine());

                f.BeginInvoke(n, callback,"ggds");

                Console.ReadLine();

    --回调方法; = f.EndInvoke(r);将结果返回

      static void Display(IAsyncResult r)

            {

                int result = f.EndInvoke(r);

                Console.WriteLine("第"+r.AsyncState+"项值是"+result);

                Console.Read();

            }

    -----------补充线程:

    ----线程是windows任务调度最小的单位,线程是程序的一个执行流;

    cpu切换的不是进程而是线程。进程占用资源太多;

    --单核cpu一个时间只有一个线程;一个exe就是一个进程;

    一个线程对应一个寄存器;

    --Process.Start("");

    ---一个应用程序与只能承载一个exe,可承载多个dll;

    ---一个进程可以有多个应用程序域;

    --一个线程可穿透多个应用程序与,

    同一时间一个线程指正属于一个应用程序域;

    一个应用程序与可以跑多个线程;

    ==一个应用程序与有一个上下文;

    ----当前线程:

     Thread t = Thread.CurrentThread;

    t.name;

    -----

       //后台线程;

       t.IsBackground = true;

    --thrad线程是clr线程和操作系统线程是不一样的;之间是映射关系;

    线程终止:Thread.abort();

    前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都

    ---会自动结束。

    ---默认为前台线程,thread.isbackground=false;

    --线程优先级:AboveNormal;

     //默认优先级:为AboveNormal;

                Thread t = Thread.CurrentThread;

                t.Priority = ThreadPriority.AboveNormal;

    -----初始化一个线程:需要1M内存;

    委托穿多个参数时,可以用list<object>

    ------windows窗体跨线程调用时,控制不能跨线程需要设置:

    Control.checkForIllegalcrossThreadcalls=false;不检查,则能跨线程

    -----lamed:

    匿名函数:Cal是委托;

    Cal c = new Cal((a, b) => { return a + b; });

    如果没有参数:

    Cal c = new Cal(() => { return 123; });

    Cal c = new Cal((a, b) => { return a + b; });

    IAsyncResult result = c.BeginInvoke(1, 2, null, null);

    //阻塞线程;

    int cc = c.EndInvoke(result);

                    Console.WriteLine(cc);

                Console.Read();

    ----cc为返回结果;

    ------------------------------------第二种通过线程池来创建:

    ----------lock锁:lock内的变量是引用类型;操作公共资源时只让一个线程来操作,进行线程隔离和线程的同步(无论哪个线程访问都是的结果,比如+1操作);比如一个数组,否则会出

    现超出索引;

    lock()--:其实内部为monitor

    {

    }

    ---创建一个实例,会在一个应用程序域创建(类空间、同步索引快(默认为-1,类型指针(指向该实例的类型));

    提到对象池,就应该想到lock;

    ---以后调用线程的时候就用线程池;guo方法是object类型;这样比穿件Thread简单多了;

       //线程池:ThreadPool.QueueUserWorkItem(new WaitCallbac(guo), "");

    ---线程池原理,将任务加载到队列排队,在进入到本地队列让cpu执行;

       {

       ThreadPool.QueueUserWorkItem(new WaitCallback(guo), "");

                Console.Write("主线程");

                Console.Read();

            }

            public static void guo(object i)

            {

                Thread.Sleep(3000);

                Console.WriteLine("sfsdf");

            }

    ---死锁:相互等待对方释放资源;

    ---委托如果是无参,有返回值,那么匿名函数,应该为 ()=>{};;

    --------3.使用task任务;

              Task<string> ta = new Task<string>(() => {

                    System.Threading.Thread.Sleep(2000);

                    Console.WriteLine("sfsf");

                    return "";

                });

                ta.Start();

                Console.Write("主线程");

                Console.Read();

    --

    --task任务,可以使用 ta.Wait();来阻塞主线程,让子线程执行完,在执行;

    --Thread t = new Thread(() => { });

      t.Join();//相当于ta.Wait();

  • 相关阅读:
    android平台从froyo 2.2开始支持jni单步调试
    Ubuntu java 环境变量
    ubuntu 10.04安装sunjava5jdk
    proc文件系统usb部分信息输出
    Linux lftp乱码解决及使用书签的方法
    用find & grep查找文件内容
    ubuntu10.10 下安装android 2.2开发环境
    VIM复制粘贴大全!
    kinect 无法在我的android开发板上显示的分析
    hdu 1087 Super Jumping! Jumping! Jumping!
  • 原文地址:https://www.cnblogs.com/guozefeng/p/3438777.html
Copyright © 2020-2023  润新知