我这里针对现有的C#多线程技术进行一个汇总,一是复习,二是方便索引,文章部份知识点来源于网络,非本人原创。

一、并行(异步):

1.System.Threading.Tasks命名空间下的(TPL):

1.1:Parallel.Invoke --并行执行多个任务,主线程等待并行执行完毕后才开始续续运行。

示例:

        static void Main(string[] args)
{
Parallel.Invoke(new ParallelOptions() { MaxDegreeOfParallelism=2},Run1,Run2);
Console.WriteLine("我是主线程!");
Console.Read();
} static void Run1()
{
Console.WriteLine("我是任务一,我运行3s");
Thread.Sleep(3000);
Console.WriteLine("任务一执先完成");
} static void Run2()
{
Console.WriteLine("我是任务二,我运行5s");
Thread.Sleep(5000);
Console.WriteLine("任务二执先完成");
}

1.2:Parallel.For--循环迭代多个任务,多个任务之间存在并行情况,主线程等待循环迭代的多个任务执行完毕后才开始续续运行。

示例:

Parallel.For(0, 10, (i) => {
Console.WriteLine("我是第{0}个任务,线程ID是:{1}",i,Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(new Random().Next(10) * 10 * 500);
Console.WriteLine("线程ID是:{0}执行完成", Thread.CurrentThread.ManagedThreadId);
});

1.3:Parallel.ForEach--循环迭代多个任务,多个任务之间存在并行情况,主线程等待循环迭代的多个任务执行完毕后才开始续续运行。注意它有多个重载方法

示例:

            var bag = new ConcurrentBag<int>();

            Parallel.ForEach(Partitioner.Create(0, 100), i =>
{
for (int m = i.Item1; m < i.Item2; m++)
{
bag.Add(m);
Console.WriteLine("我是第{0}个任务,线程ID是:{1}", m, Thread.CurrentThread.ManagedThreadId);
}
});
Console.WriteLine("并行计算:集合有:{0}", bag.Count);

1.4:TAP(基于任务的异步编),使用Task类 (注意:默认任务开启后,会在新线程中执行,主线程不会等待任务而是继续下面的执行,若使用Task.WaitAll,则会等待相应的任务完成后才会执行)

示例:

//第一种方式启动
var task1 = new Task(() => //实例化
{
Run1();
}); task1.Start(); //启动 //第二种方式开启
var task2 = Task.Factory.StartNew(() => //直接创建任务并启动
{
Run2();
}); //主线程等待任务执行完
Task.WaitAll(task1, task2);

2.ParallelEnumerable类中的扩展方法(先将枚举对象使用AsParallel转换成ParallelQuery类型,然后就可以使用ParallelQuery在ParallelEnumerable类相关的扩展方法)

示例:

var resultList = testList.AsParallel().Where(i=>i>=100).ToList();
Console.WriteLine("resultList Count:{0}", resultList.Count);

3.创建新Thread--新线程启动后,主线程与创建的线程各自执行,若需要主线程等待异步线程执行完成后才执行,则应使用asyncThread.Join方法。

示例:

        static void AsyncThreadMethod()
{
Console.WriteLine("我是异步执行线程,线程ID是:{0}", Thread.CurrentThread.ManagedThreadId);
} static void AsyncThreadMethod(object state)
{
Console.WriteLine("我是异步执行线程,线程ID是:{0},状态:{1}", Thread.CurrentThread.ManagedThreadId,state);
} //创建线程并执行
Thread asyncThread = new Thread(new ThreadStart(AsyncThreadMethod));
asyncThread.IsBackground = true;
asyncThread.Start(); Thread asyncThread2 = new Thread(new ParameterizedThreadStart(AsyncThreadMethod));
asyncThread2.IsBackground = true;
asyncThread2.Start("这是来自主线程的参数");

4.使用ThreadPool.QueueUserWorkItem静态方法--WaitCallback回调方法要求其必需带一个object的参数

示例:

 ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncThreadMethod));//不带参数,则系统将state自动设为null

ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncThreadMethod), "这是来自主线程的参数");

5.APM(异步编程模型),利用BeginInvoke与EndInvoke完成异步执行委托方法

示例:

            Func<string, string> funcDelegate = (s) =>
{
Console.WriteLine("我是Func委托方法!");
return "委托方法参数:" + s;
}; //1.无阻塞异步回调
var aysncResult = funcDelegate.BeginInvoke("这是来自主线程的参数", new AsyncCallback((result) =>
{
//获取委托对象,调用EndInvoke方法获取运行结果
AsyncResult _result = (AsyncResult)result;
var func = (Func<string, string>)_result.AsyncDelegate;
string data = func.EndInvoke(_result);
Console.WriteLine(data +",附加参数:" + _result.AsyncState.ToString());
}),"其它参数"); //2.阻塞主线程,使主线程等待执行完毕
string data2 = null;
var aysncResult2 = funcDelegate.BeginInvoke("这是来自主线程的参数2", null, null); data2 = funcDelegate.EndInvoke(aysncResult2);//第一种阻塞方法 while (!aysncResult2.IsCompleted) //第二种阻塞方法
{
Thread.Sleep(200); //虚拟操作
Console.WriteLine("主线程等待...");
}
data2 = funcDelegate.EndInvoke(aysncResult2); WaitHandle[] waitHandles = new WaitHandle[]{ aysncResult2.AsyncWaitHandle };
while (WaitHandle.WaitAll(waitHandles, 5000)) //第三种阻塞方法
{
Console.WriteLine("主线程等待...");
}

6. EAP(基于事件的异步编程)--主要用在客户端应用程序中

示例:

            //例子一
var client = new WebClient();
client.DownloadProgressChanged += delegate(object s, DownloadProgressChangedEventArgs e)
{
Console.WriteLine("Download Percent:{0}", e.ProgressPercentage);
};
client.DownloadStringCompleted += delegate(object s,DownloadStringCompletedEventArgs e){
Console.WriteLine("Download Content Length:{0}",e.Result.Length);
Console.WriteLine("Download Completed!");
}; client.DownloadStringAsync(new Uri("http://www.zuowenjun.cn")); //例子二
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) => {
Console.WriteLine("异步执行中。。。");
};
worker.RunWorkerCompleted += (s, e) => {
Console.WriteLine("异步执行完成。。。");
};
worker.RunWorkerAsync();

7.async和await关键字

示例:

	public Task<double> GetValueAsync(double num1, double num2)
{
return Task.Run(() =>
{
for (int i = 0; i < 1000000; i++)
{
num1 = num1 / num2;
}
return num1;
});
}
public async void DisplayValue()
{
double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回
//这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用
System.Diagnostics.Debug.WriteLine("Value is : " + result);
} //调用
DisplayValue();//不会阻塞主线程

参考以下相关文章:

C#综合揭秘——细说多线程(上)

C#综合揭秘——细说多线程(下)

8天玩转并行开发系列文章

.NET基础拾遗(5)多线程开发基础

C#多线程技术总结(异步)的更多相关文章

  1. [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片

    目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...

  2. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  3. 多线程技术 NSThread & NSOperation & GCD

    多线程:在iOS开发中,用到多线程的处理问题的时候有很多,比如异步下载数据时刷新界面等等. 引入多线程来处理问题的关键就是,基于多线程可以使界面更加流畅,防止界面假死. 界面假死:比如你单击一个按钮来 ...

  4. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  5. 多线程技术在iOS开发中的使用

    进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...

  6. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  7. iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  8. iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 -- 转

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  9. NSThread/NSOperation/GCD 三种多线程技术

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

随机推荐

  1. mongoDB研究笔记:写关注

    对于某些应用程序来说,写关注是重要的.它能判断哪些写操作成功写入了,哪些失败了,对于失败的操作,驱动程序能返回错误,由应用程序决定怎么处理.如果没有写关注,应用程序发送一个写操作到socket后,就不 ...

  2. vs的dll引用机制

    vs2012编译的时候,遇到一个问题就是项目A中运行时缺失dll的问题,项目A引用类库B,类库B引用了x,y等dll,编译A项目的时候,出现x没拷贝到bin 目录. 通过跟踪编译输出发现,x没拷贝的原 ...

  3. Mac OS X上编写 ASP.NET vNext 系列中断和再开声明

    这个系列其实已经中断有一段时间了,主要是由两个原因: 第一是微软那边把以前的KRE改成了XRE,所以导致前两篇有点过时了. 第二是自己年前1月份被裁员,Mac的机器被回收,再加上忙于和公司扯皮和找工作 ...

  4. 【腾讯Bugly干货分享】腾讯验证码的十二年

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581301b146dfb1456904df8d Dev Club 是一个交流移动 ...

  5. 设计模式之美:State(状态)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):由 ConcreteState 指定它的后继 State. 意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改 ...

  6. Aoite 系列(04) - 强劲的 CommandModel 开发模式(上篇)

    Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.CommandModel 是一种开发模式,我把它成为"命令模型",这是一 ...

  7. hadoop rpc基础

    第一部分: hadoop rpc基础 RPC,远程程序调用,分布式计算中C/S模型的一个应用实例. 同其他RPC框架一样,Hadoop分为四个部分: 序列化层:支持多种框架实现序列化与反序列化 函数调 ...

  8. Java多线程系列--“JUC锁”05之 非公平锁

    概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析.内容包括:参考代码获取非公平锁(基于JDK1.7.0_40)释放非公平锁(基 ...

  9. [nRF51822] 6、基于nRF51822平台的flash读写研究

    前言 本文重点介绍flash的数据存取特性.flash的内存划分.一个简单的存取图片的内存管理方式,以及对flash写前删的时间.删后读的时间.写后读的时间进行测量的一个小实验.目的在于更全面了解fl ...

  10. 可伸缩性最佳实践:来自eBay的经验

    看到一篇关于系统可伸缩性(可扩展)的文章,eBay的架构师Randy Shoup写的,原文出处没找到,就不写转载的地址了.根据自己的理解对文章有修改剪切的地方. 在eBay,可伸缩性是我们每天奋力抵抗 ...