C# 多线程

进程/线程/多线程

  • 进程:计算机概念,虚拟的记录,描述一个应用程序在计算机上运行时,所消耗的各种机资源集合—Cpu+内容+磁盘IO+网络资源。
  • 线程:一个程序的进程中,所执行的具体的某一个动作的最小执行流。
  • 句柄:是一个long类型的数字,对应着计算机程序中的某一个小部件。
  • 进程中包括多个线程;线程依附于进程存在。
  • 线程:—同步异步
  • CPU是分片执行:比如把每一个核每一秒钟可以执行的动作切分成10000份,操作系统执行多个动作时,开始动作A,使用了分片后的某一份,结束的时候可能是另外的谋一份

C#中的多线程:Thread/ThreadPool/Task

Thread.Sleep和Task.Delay区别

{
                Stopwatch stopwatch = Stopwatch.StartNew();
                stopwatch.Start();
                Thread.Sleep(3000);//主线程延迟3000毫秒,会卡界面
                stopwatch.Stop();
                Debug.WriteLine($"Sleep:3000:{stopwatch.ElapsedMilliseconds}");
            }
            {
                //Task.Delay一般和ContinueWith搭配,意指延迟一段时间(例3000毫秒)后去做一些事
                Stopwatch stopwatch = Stopwatch.StartNew();
                stopwatch.Start();

                Task.Delay(3000).ContinueWith<int>(t => 
                {
                    stopwatch.Stop();
                    Debug.WriteLine($"Dely:3000:{stopwatch.ElapsedMilliseconds}");
                    var a=  DoSomethingInt();
                    return a;
                });//延迟3000毫秒执行
            }
/*ContinueWith有可能会使用主线程其中会*/

等待线程结束(taskFactory.ContinueWhenAny和WaitAny)

       
List<Task> tasks = new List<Task>();
TaskFactory taskFactory = new TaskFactory();
//不带参数
            tasks.Add(taskFactory.StartNew(() => { DoSomethingInt("1"); }));
            tasks.Add(taskFactory.StartNew(() => { DoSomethingInt("2"); }));
            tasks.Add(taskFactory.StartNew(() => { DoSomethingInt("3"); }));
            tasks.Add(taskFactory.StartNew(() => { DoSomethingInt("4"); }));
            tasks.Add(taskFactory.StartNew(() => { DoSomethingInt("5"); }));
            //Task.WaitAny会卡顿界面
            //Task.WaitAny(tasks.ToArray());
            //taskFactory.ContinueWhenAny不会卡顿界面
            taskFactory.ContinueWhenAny(tasks.ToArray(), t => { Debug.WriteLine("Any Task is Completed"); });

//带参数的情况
            tasks.Add(taskFactory.StartNew(t => { DoSomethingInt(Convert.ToString(t)); }, "1"));
            tasks.Add(taskFactory.StartNew(t => { DoSomethingInt(Convert.ToString(t)); }, "2"));
            tasks.Add(taskFactory.StartNew(t => { DoSomethingInt(Convert.ToString(t)); }, "3"));
            tasks.Add(taskFactory.StartNew(t => { DoSomethingInt(Convert.ToString(t)); }, "4"));
            tasks.Add(taskFactory.StartNew(t => { DoSomethingInt(Convert.ToString(t)); }, "5"));
            //Task.WaitAny(tasks.ToArray());
            taskFactory.ContinueWhenAny(tasks.ToArray(), t => { Debug.WriteLine($"Task [{t.AsyncState}] is Completed"); });

WaitAll和TaskFactory.ContinueWhenAll也是一个意思

此条目发表在C#, 多线程分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注