博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程线程
阅读量:6676 次
发布时间:2019-06-25

本文共 5176 字,大约阅读时间需要 17 分钟。

01:进程线程的概念

在这里插入图片描述
02:多线程编程
在这里插入图片描述
在这里插入图片描述
03:通过异步委托开启多线程

class Program    {        static void Main(string[] args)//main线程执行的顺序是从上到下的        {            Func
func = Test; //通过委托异步开启一个新线程func所引用的方法 IAsyncResult result=func.BeginInvoke(1, "哈哈!!", null, null);// IAsyncResult 为线程异步操作的状态 Console.WriteLine("main1"); //第一种检测线程结束的方法 while (result.IsCompleted==false)//线程还没有指向完毕 { Console.WriteLine("还没有完成"); Console.WriteLine(); } //第二种检测线程结束的方法 bool isEnd=result.AsyncWaitHandle.WaitOne(1);//如果等待1000毫秒线程结束了返回true否则为false if (isEnd) { Console.WriteLine(func.EndInvoke(result)); //取得异步线程的返回值 } Console.WriteLine("main2"); Console.WriteLine(func.EndInvoke(result)); //取得异步线程的返回值 Console.ReadKey(); } static string Test(int a,string b) { Thread.Sleep(100);//暂停当前线程0.1秒 return a + b; } }

在这里插入图片描述

04:异步委托开启多线程中回调函数和等待句柄

class Program    {        static void Main(string[] args)//main线程执行的顺序是从上到下的        {            Func
func = Test; //通过委托异步开启一个新线程func所引用的方法 // IAsyncResult 为线程异步操作的状态 //倒数第一个参数 表示给回调函数传参数 //倒数第二个参数是委托 表示线程结束后回调用这个委托指向的方法 IAsyncResult result =func.BeginInvoke(1, "哈哈!!", CallBack, func); Console.WriteLine("main1"); Console.WriteLine("main2"); Console.ReadKey(); } static string Test(int a,string b) { Thread.Sleep(10);//暂停当前线程0.1秒 return a + b; } //回调函数 public static void CallBack(IAsyncResult result) { Console.WriteLine("子线程结束啦"); Func
a = result.AsyncState as Func
; Console.WriteLine(a.EndInvoke(result)); } }

在这里插入图片描述

05:通过Thread类开启一个线程

class Program    {           static void Main(string[] args) //main线程执行的顺序是从上到下的        {            MyThread  myThread=new MyThread(100, "唐不苦");            //创建一个线程对象            Thread thread =new Thread(() =>               {                   myThread.DownLoad();                                      Console.WriteLine("thread:" + Thread.CurrentThread.ManagedThreadId);                                 }               );            //线程启动            thread.Start();            Console.WriteLine("main"+Thread.CurrentThread.ManagedThreadId);            Console.ReadKey();        }    }    public class MyThread    {        public int ID { get; set;}        public string Name { get; set; }        public MyThread(int id,string name)        {            this.ID = id;            this.Name = name;        }        public void DownLoad()        {            Console.WriteLine("开始下载。。。。"+Thread.CurrentThread.ManagedThreadId);            Thread.Sleep(1000);            Console.WriteLine("下载完成:"+"ID"+ID+"Name:"+Name);        }    }

在这里插入图片描述

06:后台线程和前台线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MyThread  myThread=new MyThread(100, "唐不苦");            //创建一个线程对象 默认 Thread创建的是前台线程            Thread thread =new Thread(() =>               {                   myThread.DownLoad();                                      Console.WriteLine("thread:" + Thread.CurrentThread.ManagedThreadId);                              }               );            thread.IsBackground = true;//设置为后台线程            thread.Priority = ThreadPriority.Lowest;//设置优先级                       //线程启动            thread.Start();            Console.WriteLine("main" + Thread.CurrentThread.ManagedThreadId);

07:线程池

在这里插入图片描述

在这里插入图片描述

static void Test(object o)        {            Console.Write(Thread.CurrentThread.ManagedThreadId);            Console.WriteLine();            Console.WriteLine("666");        }        static void Main(string[] args) //main线程执行的顺序是从上到下的        {            ThreadPool.QueueUserWorkItem(Test);            ThreadPool.QueueUserWorkItem(Test);            ThreadPool.QueueUserWorkItem(Test);            Console.ReadKey();           }

08:任务开启线程

static void Test1(object o)        {                       Console.WriteLine("开始下载");            Thread.Sleep(1000);            Console.WriteLine("下载完成"+o.ToString());                 }        static void Main(string[] args) //main线程执行的顺序是从上到下的        {            Task task=new Task(()=>{Test1(22);});            task.Start();            //任务工厂            TaskFactory factory=new TaskFactory();            //开始任务            factory.StartNew(() => { Test1(22); });                  Console.ReadKey();           }

09:连续任务

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

static void FirstTask()        {            Console.WriteLine("第一个任务开始:TaskID:{0}", Task.CurrentId);            Thread.Sleep(3000);        }        static void SecondTask(Task task)        {            Console.WriteLine("任务{0}完成", task.Id);            Console.WriteLine("第二个任务开始:TaskID:{0}", Task.CurrentId);            Console.WriteLine("清理工作......");            Thread.Sleep(3000);        }        static void Main(string[] args) //main线程执行的顺序是从上到下的        {            Task t1 = new Task(FirstTask);            Task t2 = t1.ContinueWith(SecondTask);            t1.Start();            Thread.Sleep(7000);            Console.ReadKey();           }

在这里插入图片描述

09:线程中争用条件和死锁的问题

在这里插入图片描述

转载地址:http://mcrxo.baihongyu.com/

你可能感兴趣的文章
晒晒公司电脑配置
查看>>
Looper.myLooper().quit() 报 NullPointerException
查看>>
SSH1还是SSH2与Annotation还是Xml配置的问题
查看>>
简单构建工具SBT
查看>>
分享一个快速开发jQuery插件工具:jqueryboilerplate(转)
查看>>
Training的第二十天
查看>>
mysql设置主键自动增长
查看>>
linux系统的启动过程
查看>>
MySQL性能分析
查看>>
IIS错误日志 事件ID: 1093
查看>>
解决Unable to resolve target 'android-7'报错
查看>>
Connections could not be acquired from the unde...
查看>>
UIAlertView 总结
查看>>
邮件服务器:SMTP协议原始命令码和工作原理
查看>>
在Sublime Text中配置 JavaScript 控制台(JavaScript Console in Sublime Text)
查看>>
python使用os模块获取当前目录
查看>>
DNS服务(一)——DNS原理及其解析过程详解
查看>>
卸载linux软件总结
查看>>
redhat 6.5 安装和配置zabbix客户端
查看>>
硬链接和软链接(2)
查看>>