异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它委托是方法的类型安全的引用Delegate类还支持异步地调用方法。在后台,Delegate类会创建一个执行任务的线程
  • 投票,并检查委托是否完成了任务

    • 所创建的Delegate类提供了BeginInvoke()方法,该方法中,可以传递用委托类型定义的输入参数。

    • BeginInvoke()方法总是有AsyncCallback和Object类型的两个额外参数

    • BeginInvoke()方法返回类型:IAsyncResult

    • 代码示例

        static void Main(string[] args){// synchronous method call// TakesAWhile(1,3000);// asynchronous by using a delegateTakesAWhileDelegate dl = TakesAWhile;IAsyncResult ar = dl.BeginInvoke(1, 500, null, null);while (!ar.IsCompleted){// doing something else in the main threadConsole.Write(".");Thread.Sleep(50);}int result = dl.EndInvoke(ar);Console.WriteLine("result:{0}", result);}public delegate int TakesAWhileDelegate(int data, int ms);static int TakesAWhile(int data, int ms){Console.WriteLine("TakesAWhile started");Thread.Sleep(ms);Console.WriteLine("TakesAWhile completed");return ++data;}
  • 使用与IAsyncResult相关联的等待句柄

    • 使用AsyncWaitHandle属性可以访问等待句柄

    • 代码示例,在此将上述示例中的While循环更改一下即可,如下

            while (true){Console.Write(".");if (ar.AsyncWaitHandle.WaitOne(50, false)){Console.WriteLine("Can get the result now");break;}}
  • 异步回调

    • 在BeginInvoke()方法的第3个参数中,可以传递一个满足AsyncCallback委托的需求的方法

    • 代码示例

            TakesAWhileDelegate dl = TakesAWhile;dl.BeginInvoke(1, 500, TakesAWhileCompleted, dl);for (int i = 0; i < 100; i++){Console.Write(".");Thread.Sleep(50);}
        static void TakesAWhileCompleted(IAsyncResult ar){if (ar == null)throw new ArgumentNullException("ar");TakesAWhileDelegate dl = ar.AsyncState as TakesAWhileDelegate;Trace.Assert(dl != null, "Invalid object type");int result = dl.EndInvoke(ar);Console.WriteLine("result:{0}", result);}

Thread类

  • Thread类可以创建和控制线程

  • 默认情况,Thread类创建线程是前台线程。线程池中的线程总是后台线程。

  • 只要有一个前台线程在运行,应用程序的进程就在运行。Thread类创建线程时,可以设置IsBackground属性,以确定该线程时前台线程还是后台线程

  • 代码示例

            var t1 = new Thread(ThreadMain) { Name = "MyNewThread", IsBackground = false };t1.Start();Console.WriteLine("Main thread ending now.");
        static void ThreadMain(){Console.WriteLine("Thread {0} started", Thread.CurrentThread.Name);Thread.Sleep(3000);Console.WriteLine("Thread {0} completed", Thread.CurrentThread.Name);}

线程池

  • ThreadPool类托管,在需要时增减池中线程的线程数,直到最大的线程数

  • ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallback类型的委托

  • 代码示例

            int nWorkerThreads;int nCompletionPortThreads;ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionPortThreads);Console.WriteLine("Max worker threads:{0},I/O completion threads:{1}",nWorkerThreads, nCompletionPortThreads);for (int i = 0; i < 5; i++){ThreadPool.QueueUserWorkItem(JobForAThread);}
        static void JobForAThread(object state){for (int i = 0; i < 3; i++){Console.WriteLine("loop{0},running inside pooled thread{1}",i, Thread.CurrentThread.ManagedThreadId);Thread.Sleep(50);}}

任务

  • .NET 4包含新名称空间 System.Threading.Tasks,它包含的类抽象出了线程功能。在后台使用ThreadPool.

  • 启动新任务

    • 实例化TaskFactory类,在其中把TaskMethod()方法传递给StartNew()方法
    • 使用Task类的构造函数,调用Task类的Start()方法
    • 示例代码
            //using task factoryTaskFactory tf = new TaskFactory();Task t1 = tf.StartNew(TaskMethod);//using the task factory via a taskTask t2 = Task.Factory.StartNew(TaskMethod);//using Task constructorTask t3 = new Task(TaskMethod);t3.Start();Task t4 = new Task(TaskMethod, TaskCreationOptions.PreferFairness);t4.Start();
        static void TaskMethod(){Console.WriteLine("running in a task");Console.WriteLine("Task id:{0}", Task.CurrentId);}

C# 多线程初级汇总相关推荐

  1. [远航笔记流水账]易大漠多线程初级教程086(1-3)

    1.易大漠多线程初级之多线程介绍 什么是多线程 没什么可说的 单线程: 多线程: 2.易大漠多线程初级之函数命令介绍 多线程的4个基础函数: 注意: 1.如果挂起失败 和恢复失败 函数会返回-1  如 ...

  2. 同步异步单线程多线程初级理解

    对于我开始接触同步异步单线程多线程的概念的时候,都是分别理解同步和异步.单线程和多线程概念,当看到"使用同步方法保证线程安全"时愚昧的理解为那就是单线程咯:于是就陷入了困惑,同步等 ...

  3. java多线程知识汇总(三)如何选择锁?如何加锁

    1.锁,保证的是被锁的代码,一次执行完毕才能被其他线程执行,锁保证了一个线程执行过程中不被其他线程打断.以保证数据的准确性. 2.数据的读写过程,是有冲突的,当一个线程正在读数据,另一个线程正在写同一 ...

  4. ubuntu16.04 安装 lnmp 及php 多线程 初级版本

    1 切换为root 帐号登录 2 更新apt-get源为阿里云的源 :貌似容易出现问题. 3 安装 nginx :apt-get install nginx 4 安装 php7 :apt-get in ...

  5. 有没有一种可能,我可以学好Java的多线程——知识点汇总

    一.前言 这篇文章是介绍Java基础知识--多线程的,读完这篇文章,各位小伙伴们可以收获哪些呢? 程序.进程.线程三者的区别 创建线程的四种方式 线程的常用方法 线程的死锁.释放锁 线程的同步原理.生 ...

  6. 多线程初级模拟12306抢票

    package com.lzy.thread; /*** 共享资源,并发(线程安全)* @author Administration**/ public class eWeb12306 impleme ...

  7. C++多线程Demo

    <C++多线程Demo>   多线程访问共享资源时,采取对资源加锁的方式来防止产生脏数据和错误.多线程访问同一个数据库时,数据库是共享资源,所以对库操作要加锁.对于操作同一个数据结构对象的 ...

  8. 【艾琪出品】《计算机应用基础》【试题汇总5】

    南开大学(本部)-20秋学期(1709.1803.1809.1903.1909.2003.2009 )<大数据导论>在线作业 1. 大数据的最显著特征是() . A 数据规模大 B 数据类 ...

  9. Java多线程(四)线程并发的理解

    前言 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. ----以上摘自百度百科 一.龟 ...

最新文章

  1. Android 学习之pull解析Xml
  2. STM32 基础系列教程 39 - Lwip_tftp
  3. 旷视:深度学习框架开源
  4. 初识Flink-从WorldCount开始
  5. Java Web托管选项流程图
  6. 6-1 数组函数练习
  7. 软件工程导论 统一建模语言UML概述
  8. 软件工程网络15个人作业3——案例分析
  9. 注解配置springMvc及向作用域中赋值
  10. VideoView播放视频会引起其它音乐播放器暂停问题解决
  11. vue vant ui 教程注意事项
  12. 游戏建模教程:肌肉建模丨人体比例及肌肉骨骼介绍
  13. Mac 下如何用命令行解压和压缩 rar 文件
  14. 6个不可多得的黑科技网站!
  15. 戴尔服务器虚拟机巨兽龙在哪,dell服务器安装的vmware esxi 虚拟机紫萍
  16. java学习之屌丝逆袭
  17. 监控系统相关的常见面试问题
  18. win10耳机有杂音滋滋_蓝牙耳机的底噪和电流声有区别吗?双11五款高续航平价蓝牙耳机分享...
  19. MySQL中:一条update语句是怎样执行的
  20. 基于STM32的阿里云智能路灯照明控制系统

热门文章

  1. QtAV学习笔记 解决RTSP流无法播放问题(三)
  2. 构建学习tensorflow
  3. 知识备忘phpcms 简单解析一 数据表字段
  4. 无监督式GAN(infoGAN) matlab实战
  5. IDEA下的Java编程
  6. android 9.0 系统添加开机铃声
  7. 【QT】使用QML构建一个简易的计算器界面(一)
  8. MySQL数据文件被误删,如何进行恢复?
  9. S7-1200 PLC与PAC3200电能表的Modbus RTU通信(详细步骤)
  10. R语言小白学习笔记13—基本统计