C#并发编程

时间:2022-06-09 07:47:19

最近看C# 并发编程··,这里做一下总结··多线程,异步,并行,大部分都是最近看C#并发编程这个书涉及到的··这里仅仅列出实现方式,书里边介绍的其他的东西没有设计比如取消操作,同步操作,集合之类的东西

线程:Thread,ThreadPool,BackgroundWorker,

Thread 可以又更多控制··ThreadPool就是丢进去系统好管理线程,BackgroundWorker相当于加了事件的线程,用在thread执行函数里边加事件,外边注册加invoke就可以实现类似backgroundworker的功能,

但是机制好像不太一样,看了反编译的方法invoke里边的代码 带了大量的非托管代码··看不大懂··,backgroundworker内部使用委托的异步执行方式,就是begininvoke,  C#的begininvoke内部实现好像就是多线程,通过同步上下文回到ui线程实现类似invoke 的操作

thread 和threadpool都可以传递一个委托进去,这样可以通过委托做一些特殊操作··也可以直接定义个事件实现通知进度的功能

4.5的async/await  里边iprogress也能实现类似报告进度功能

代码在winform窗体里边执行
 private event EventHandler myevent;
//thread myevent += delegate { Invoke(new EventHandler(delegate { Text = "threadtest"; })); }; Action myaction = new Action(() => { MessageBox.Show("delegatetest"); }); new Thread(new ParameterizedThreadStart((obj) => { //dosomthing Thread.Sleep(2000); (obj as Action)(); })).Start(myaction); new Thread(new ThreadStart(() => { //dosomething Thread.Sleep(2000); myevent?.Invoke(null, new EventArgs()); })).Start(); //backgroundworker BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += delegate { //dosomething Thread.Sleep(2000); worker.ReportProgress(100); }; worker.ProgressChanged += (send, stat) => { Text = "doworker"; }; worker.RunWorkerAsync(); //threadpool ThreadPool.QueueUserWorkItem(new WaitCallback((stat) => { //dosomthing Thread.Sleep(1000); })); //task 异步 Task t = new Task(() => { //dosomething Thread.Sleep(3000); }); Action<Task> taction = new Action<Task>((tas) => { Text = "Task"; }); var context = TaskScheduler.FromCurrentSynchronizationContext();//这里创建一个当前上下文的人物调度器,其实就是当前的ui线程上下文 t.ContinueWith(taction, context);//吧上边的调度器传入,接着的这个人物就会用这个调度器执行,内部起始就是post方法把操作放在当前ui线程进行同步执行,这样就不会报错了 t.Start();//这里是异步的方式,默认是以线程池的方式执行,如果在这里方式ui操作会报错线程间操作无效

之前的异步编程,通过beginInvoke ,委托和control都有类似方法,invoke就是同步执行, begininvoke异步执行,这个里边据说也是用线程池实现的异步

Action act = new Action(() => { Thread.Sleep(2000); Console.WriteLine("121231"); }); var callback = new AsyncCallback((iasynccallback) => { Console.WriteLine("OK"); }); var res=act.BeginInvoke(callback, null); Console.WriteLine("异步测试"); act.EndInvoke(res);

上边有Task的写法,task通过任务调度器也就是TaskScheduler来实现调度,可以在当前线程执行,也可以通过线程池执行,这个TaskScheduler 有两种实现,一种是用线程池实现,一种用上下文实现类似上边的backgroundworker,

也就是SynchronizationContext这个类,这个类又一个Post方法可以将异步的方法以同步的方式执行到指定的上下文中去,

而4.5里边的async/await也是以类似的方式,又上下文这个概念,这个async/await 花样可多了···这里就不多说了。。。