c#多线程随记回顾

系统 1799 0

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();

c#多线程随记回顾


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论