本文共 5176 字,大约阅读时间需要 17 分钟。
01:进程线程的概念
02:多线程编程 03:通过异步委托开启多线程class Program { static void Main(string[] args)//main线程执行的顺序是从上到下的 { Func04:异步委托开启多线程中回调函数和等待句柄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; } }
class Program { static void Main(string[] args)//main线程执行的顺序是从上到下的 { Func05:通过Thread类开启一个线程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)); } }
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/