异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它

委托是方法的类型安全的引用

Delegate类还支持异步地调用方法。在后台,Delegate类会创建一个执行任务的线程
  • 投票,并检查委托是否完成了任务

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

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

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

    • 代码示例

        static void Main(string[] args)
{
// synchronous method call
// TakesAWhile(1,3000); // asynchronous by using a delegate
TakesAWhileDelegate dl = TakesAWhile;
IAsyncResult ar = dl.BeginInvoke(1, 500, null, null);
while (!ar.IsCompleted)
{
// doing something else in the main thread
Console.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 factory
TaskFactory tf = new TaskFactory();
Task t1 = tf.StartNew(TaskMethod); //using the task factory via a task
Task t2 = Task.Factory.StartNew(TaskMethod); //using Task constructor
Task 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. Java 多线程初级汇总

    多线程概述 抢占式多任务 直接中断而不需要事先和被中断程序协商 协作多任务 被中断程序同意交出控制权之后才能执行中断 多线程和多进程区别? 本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同 ...

  2. Windows 多线程知识点汇总

    一.什么叫原子性? 答:一个操作不会被分成两个时间片来执行,不会刚执行到一半,由于时间片到了,CPU就跑去执行其他线程了.在多线程环境中对一个变量进行读写时,我们需要有一种方法能够保证对一个值的操作是 ...

  3. java多线程知识点汇总(一)多线程基础

    1.什么叫多线程程序? 答:一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序. java编写的程序都是多线程的,因为最少有俩线程,main主线程和gc线程. ...

  4. java多线程知识点汇总(四)多线程知识点脉络图

    1.多线程安全问题 1)synchronized关键字:如何加锁的问题,选择synchronized方法还是synchnized代码块. 选择哪个锁问题,this对象,还是class对象(针对stat ...

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

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

  6. java多线程知识点汇总(二)多线程实例解析

    本实验主要考察多线程对单例模式的操作,和多线程对同一资源的读取,两个知识.实验涉及到三个类: 1)一个pojo类Student,包括set/get方法. 2)一个线程类,设置student的成员变量a ...

  7. CyclicBarrier 是如何做到等待多线程到达一起执行的?

    我们有些场景,是需要使用 多线各一起执行某些操作的,比如进行并发测试,比如进行多线程数据汇总. 自然,我们可以使用 CountDownLatch, CyclicBarrier, 以及多个 Thread ...

  8. #include <mutex>

    多线程初级 #include <iostream> #include <thread> #include <windows.h> #include <mute ...

  9. Java面试 32个核心必考点完全解析

    目录 课程预习 1.1 课程内容分为三个模块 1.2 换工作面临问题 1.3 课程特色 课时1:技术人职业发展路径 1.1 工程师发展路径 1.2 常见技术岗位划分 1.3 面试岗位选择 1.4 常见 ...

随机推荐

  1. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  2. ubuntu14.04安装jupyter notebook

    1.使用pip安装Jupyter notebook: pip install jupyter notebook 2.创建Jupyter默认配置文件: jupyter notebook --genera ...

  3. go语言之行--结构体(struct)详解、链表

    一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...

  4. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  5. 20155321 《网络攻防》 Exp8 Web基础

    20155321 <网络攻防> Exp8 Web基础 基础问题回答 什么是表单? 表单是主要负责数据采集功能.主要是以下三个部分构成: 表单标签:包含处理表单数据所用的程序的URL以及数据 ...

  6. WPF的DataTrigger绑定自身属性

    原文:WPF的DataTrigger绑定自身属性 <DataTrigger Binding="{Binding RelativeSource={RelativeSource self} ...

  7. MiZ702学习笔记9——XADC采集片上数据PS版

    这次借助zynq的内嵌的XADC来采集zynq内部的一些参数: •VCCINT:内部PL核心电压 •VCCAUX:辅助PL电压 •VREFP:XADC正参考电压 •VREFN:XADC负参考电压 •V ...

  8. 设计模式 笔记 享元模式 Flyweight

    //---------------------------15/04/20---------------------------- //Flyweight 享元模式------对象结构型模式 /* 1 ...

  9. chrome浏览器插件 Octotree 让你浏览GitHub的时候像IDE 一样提供项目目录

    GitHub 作为代码托管平台,竟然没有提供项目目录,方便用户在线快速浏览项目结构.所以,在线分析项目源码就会变得很繁琐,必须一层一层点击,然后再一次一次地向上返回.要知道,本来 GitHub 网站在 ...

  10. 【翻译】给初学者的 Neural Networks / 神经网络 介绍

    本文翻译自 SATYA MALLICK 的  "Neural Networks : A 30,000 Feet View for Beginners" 原文链接: https:// ...