当前位置: 首页 > ai >正文

C# 多线程

C# 开启多线程的方式

1.异步委托开启线程(BeginInvoke)

        static void Main(string[] args){//1.赋值方法//Action<int, int> a = add;    //add是定义的一个方法//2.lambdaAction<string> action = t =>{for (int k = 0; k < 1000000000; k++){ }Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);};//3.delegate//private delegate int NewTaskDelegate(int a, int b);//NewTaskDelegate task = add;//IAsyncResult asyncResult = task.BeginInvoke(20, 20, null, null);action.BeginInvoke("参数是", null, null);Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);Console.Read();}

2.Thread

        static void Main1(string[] args){Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);//1.带参数ParameterizedThreadStart threadStart = t =>{for (int k = 0; k < 1000000000; k++){ }Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);};Thread thread = new Thread(threadStart);thread.Start(1);//2.不带参数//Thread mythread = new Thread(ThreadMain);    //ThreadMain外部定义不带参数的方法//mythread.Start();//3.lambda//Thread thread = new Thread(() => startBuffering(ratio, ratious, thickness));thread.Priority = ThreadPriority.Lowest;//thread.IsBackground = true;//thread.Start();Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);}

后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。就是当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行,此时,所有剩余的后台线程都会被停止且不会完成.但是,只要还有一个前台线程没有结束,那么它将阻止程序结束.应用程序进程的存亡由前台线程决定而于后台线程无关.

3.ThreadPool线程池

        static void Main2(string[] args){//1.WaitCallback waitCallback = t =>{for (int k = 0; k < 1000000000; k++){ }Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);};ThreadPool.QueueUserWorkItem(waitCallback, 2);//2.ThreadPool.QueueUserWorkItem(new WaitCallback((a) =>{Console.WriteLine("WorkItem1-Start【ThreadId=" + Thread.CurrentThread.ManagedThreadId + "】:" + DateTime.Now);Thread.Sleep(2000);Console.WriteLine("WorkItem1-End【ThreadId=" + Thread.CurrentThread.ManagedThreadId + "】:" + DateTime.Now);}));Console.Read();}

4.Task

//1.通过start启动
var task1 = new Task(() =>
{//TODO you code
})
task1.start();
//2.直接运行
var task2 = Task.Factory.StartNew(() =>
{//TODO you code
});//3.
task.Wait();
task.WaitAll();
Task.WaitAny();
Task.ContinueWith();  //4.获取task结果
var SendFeedBackTask = Task.Factory.StartNew(() => { Console.WriteLine("Get some Data!"); }).ContinueWith<bool>(s => { return true; }).ContinueWith<string>(r => {if (r.Result){return "Finished";}else{return "Error";}});//5.Task 的取消
//IsCancellationRequested
//https://johnthiriet.com/cancel-asynchronous-operation-in-csharp///6.返回值
//Task<TResult>就是有返回值的Task,TResult就是返回值类型Task<string> task = Task<string>.Run(() => {Thread.Sleep(2000); return Thread.CurrentThread.ManagedThreadId.ToString(); 
});

5.Parallel

        static void Main3(string[] args){Action action1 = () =>{for (int k = 0; k < 1000000000; k++){ }Console.WriteLine("当前参数是1,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);};Action action2 = () =>{for (int k = 0; k < 1000000000; k++){ }Console.WriteLine("当前参数是2,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);};Action action3 = () =>{for (int k = 0; k < 1000000000; k++){ }Console.WriteLine("当前参数是3,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);};Parallel.Invoke(action1, action2, action3);Console.Read();}

参考:
https://www.cnblogs.com/yangxi1081/p/9639958.html

http://www.xdnf.cn/news/11325.html

相关文章:

  • 分享116个PHP源码PHP源码,总有一款适合你
  • 20种常用的软件测试方法,建议先收藏再观看
  • 如何在 FoxyProxy 中设置 YiLu Proxy
  • VMware虚拟机安装教程(超详细)
  • 第五章:即速应用
  • navigator.userAgent浏览器检测(前端基础系列)
  • 浅谈Qt的编译方式:qmake/cmake/qbs及qbs被弃用的原因
  • Rails配置(一)——安装rails
  • 解决因缺少COMDLG32.OCX无法启动应用程序问题
  • K210芯片介绍
  • Java中Arrays.sort()一维数组的升序、降序、区间排序
  • 1寸2寸3寸5寸6寸8寸10寸照片的具体尺寸(附常用照片尺寸对照表)
  • c语言中tm与time_t两种时间格式的转换
  • 双系统Ubuntu 从下载镜像到安装
  • dom(getElementsByName()\getElementsByName()\getAttribute()\setAttribute()\节点属性)
  • 小区门户网站之后台管理
  • stringstream用法总结
  • 深度解读汽车域控制器
  • 这5款免费的 FTP 客户端,你用过几个?Windows、Mac 和 Linux都适用!
  • 在oracle中的scn技术
  • 关于环网
  • 【安卓Android】VibratorService分析
  • LUN详解
  • 深入浅出了解撞库攻击!
  • 菜鸟也学Ogre-一步步搭建Ogre
  • mysql触发器
  • 三基色、对比色、互补色之间的关系,图片调色基础
  • 推荐10个爬虫工程师必备的工具,让你想爬就爬_爬虫工具
  • 汇编指令lea
  • 关于android的中文文档