static void AggregateExceptionsDemo() { var task1 = Task.Factory.StartNew(() => { var child1 = Task.Factory.StartNew(() => { throw new CustomException("Attached child2 faulted."); },TaskCreationOptions.AttachedToParent); throw new CustomEx…
异常是程序在有bug时最直观的表现形式,不担心有bug存在,而担心bug埋没在大堆的代码中而发现不了. 这篇随笔简单谈谈从AggregateException类源码(http://www.projky.com/dotnet/4.5.1/System/AggregateException.cs.html)中窥出的.NET Framework类库设计的方式. 总结有以下几点: 1.特性的使用:DebuggerDisplayAttribute,SerializableAttribute 2.只读属性的…
用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Runtime)是一个可由多种编程语言(VB.F#等)使用的公共语言运行库. 托管模块:编译源码会生成托管模块,他是标准的PE文件.包含:PE32头.CLR头.IL中间语言. 元数据:CLR除了生成IL外,还会生成元数据.元数据总与包含IL代码的文件相关联. 程序集:是一个或多个模块/资源的逻辑性分组.…
在一些常见的编程情形中,使用任务也许能提升性能.为了简化变成,静态类System.Threading.Tasks.Parallel封装了这些常见的情形,它内部使用Task对象. Parallel.For & Parallel.Foreach & Pararllel.Invoke  Parallel.For(, , (i) => { //i是从0开始一直到1000结束 }); var lst = new List<string>(); Parallel.ForEach(ls…
Task开启线程 有两种启动方式: 1.构造创建线程,然后启动 var taskForAction = new Task(() => { //do something }); taskForAction.Start(); 注:构造所有的重载并没有传入Func函数的,而且我们这个时候看线程池中活动线程数会发现改变 //打印线程池中线程活动数 PrintAvailabeWorkThreadNum(); var taskForAction = new Task(() => { //do someth…
一.CLR线程池基础 前面说过,创建和销毁线程是一个比较昂贵的操作,太多的线程也会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还有损于性能.为了改善这个情况,CLR使用了代码来管理它自己的线程池.可将线程池想像成可由你的应用程序使用的一个线程集合.每个进程都有一个线程池,它在各个应用程序域(AppDomain)是共享的.     CLR初始化时,线程池是没有线程的.在内部,线程池维护了一个操作请求队列.应用程序想执行一个异步操作时,就调用某个方法,将一个记录项(…
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情,这也是C#中async/await或是Jscex等异步编程模型的优势之一.但是,同步的错误处理机制,并不能完全避免异步形式的错误处理方式,这需要一定实践规范来保证,至少我们需要了解async/await到底是如何捕获和分发异常的.在开发Jscex的过程中,我深入了解了很多关于TPL和C#异步特性方面…
Task 是什么 ? Task 是一个类, 它表示一个操作不返回一个值,通常以异步方式执行. Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中. 继承层次结构 System.Object  System.Threading.Tasks.Task    System.Threading.Tasks.Task<TResult> 因为由执行工作 Task 对象通常以异步方式执行在线程池线程上而不是以同步方式在主应用程序线程,您可以使用 Status 属…
在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的.计算限制的操作,例子很简单,不是吗? 然而,在今天这篇博客中,我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启用这个技术. Microsoft为了克服这些限制(同时解决其他一些问题),引入了任务(tasks)的概念…
以前的异常处理,习惯了过程式的把出现的异常全部捕捉一遍,然后再进行处理.Async/Await关键字出来之后的确简化了异步编程,但也带来了一些问题.接下来自己将对这对关键字进行学习.然后把研究结果放在这里. 本篇中采用MSDN中的一个列子进行学习,链接如下: http://msdn.microsoft.com/zh-cn/library/jj619227.aspx 现在正式开始,首先尝试一个过程式捕捉异步操作中错误的例子: class Program { static async Task Th…
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 线程 线程内部组成 线程内核对象 thread kernel object,在该结构中,包含一组对线程进行描述的属性.数据结构中还包括所谓的线程上下文thread context.上下文是一个内存块,包含了CPU的寄存器集合,占用几百到几千个字…
1.Parallel并发执行 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Diagnostics;using System.Threading;using System.Configuration;using System.Collections.Concurrent;namespace Con…
前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开上传,加快上传速度. 数据分批计算 如几百万数据可以拆成许多无关联的部分,并行计算处理.最后聚合. 数据推送 也是需要将数据拆解后,并行推送. 任务并行库-数据并行 如果在一个循环内在每次迭代只执行少量工作或者它没有运行多次迭代,那么并行化的开销可能会导致代码运行的更慢.使用并行之前,应该对线程(锁…
任务概述 线程(Thread)是创建并发的底层工具,因此有一定的局限性(不易得到返回值(必须通过创建共享域):异常的捕获和处理也麻烦:同时线程执行完毕后无法再次开启该线程),这些局限性会降低性能同时影响并发性的实现(不容易组合较小的并发操作实现较大的并发操作,会增加手工同步处理(加锁,发送信号)的依赖,容易出现问题). 线程池的(ThreadPool)的QueueUserWorkItem方法很容发起一次异步的计算限制操作.但这个技术同样有着许多限制,最大的问题是没有内建的机制让你知道操作在什么时…
我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启用这个技术. Microsoft为了克服这些限制(同时解决其他一些问题),引入了任务(tasks)的概念.顺带说一下我们得通过System.Threading.Tasks命名空间来使用它们. 现在我要说的是,用线程池不是调用ThreadPool的QueueUserWorkItem方法,而是用任务来做…
https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?redirectedfrom=MSDN&view=netframework-4.7.2 Task Class 定义 命名空间: System.Threading.Tasks Assemblies: System.Threading.Tasks.dll, mscorlib.dll, netstandard.dll, System.Runtime.dll 表…
上一篇文章里我们讨论了某些async/await的用法中出现遗漏异常的情况,并且谈到该如何使用WhenAll辅助方法来避免这种情况.WhenAll辅助方法将会汇总一系列的任务对象,一旦其中某个出错,则会抛出“其中一个”异常.那么究竟是哪个异常?如果我们要处理所有的异常怎么办?我们这次就来详细讨论await操作在异常分派时的相关行为. await抛出异常时的行为 要理解await的行为,还是从理解Task对象的异常表现开始.Task对象有一个Exception属性,类型为AggregateExce…
原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行…
原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行…
Part 5: Parallel Programming In this section, we cover the multithreading APIs new to Framework 4.0 for leveraging multicore processors: Parallel LINQ or PLINQ The Parallel class The task parallelism constructs The concurrent collections SpinLock and…
不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程.对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦出现异常没有捕获,将会带来难以发现的bug,进而造成系统崩溃.而多线程本身也不是一朝一夕就能学好的,必须不断的去学习总结,所以我个人认为你要用一种线程模型,首先要对它有足够的了解,特别是对异常的捕获.如果你没有完全的把握,最好在实际开发中谨慎的用多线程. 1,APM异步编程模型. 采用BeginXX…
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using GearUp.Crawler.Entities; using HtmlAgilityPack; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using…
最近试着做了几个.NET CORE的demo,看了些源码,感觉异步编程在Core里面已经成为主流,而对这块我还没有一个系统的总结,所以就出现了这篇文字,接下来几篇文章,我会总结下异步编程的思路,主要参考clr via c#及以前看过的优秀博文.第一篇文字,我们一起来就打牢基础,把线程基础知识梳理一遍. 本文完全原创,如果转载请注明原文作者及链接. 一.线程基础 每个线程都有以下要素 线程内核对象(thread kernael object) os为系统中创建的每个线程都分配并初始化这种数据结构,…
由CLR via C#(第三版) ,摘抄记录... 异步优点:在GUI应用程序中保持UI可响应性,以及多个CPU缩短一个耗时计算所需的时间. 1.CLR线程池基础:为提高性能,CLR包含了代码来管理他自己的线程池--线程的集合.每CLR一个线程池,这个线程池就由CLR控制的所有appDomain共享.如果你进程中有多个CLR,就有多个线程池. CLR初始化时,池空,线程池维护一个操作请求队列.应用调用方法执行异步,将一个记录项(entry)追加到线程池的队列.线程池从队列提取记录项,派遣(dis…
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Try { public class ParallelTest { #region 分区块并行执行 public static void TestPartition…
目录 0.背景引入 1.async和await基本语法 2.异步方法的执行顺序 3.取消一个异步操作 4.同步和异步等待任务 5.异步操作中的异常处理 6.多线程和异步的区分 7. 在 .NET MVC中异步编程 8. 参考及示例源码 shanzm-2020年3月7日 23:12:53 0.背景引入 现在的.net异步编程中,一般都是使用 基于任务异步模式(Task-based Asynchronous Pattern,TAP)实现异步编程 可参考微软文档:使用基于任务的异步模式 基于任务的异步…
第五部分 并行线程   在本节中,我们将介绍Framework 4.0新增的利用多核处理器的多线程API: 并行LINQ或PLINQ Parallel 类 任务并行性构造 并发集合 自旋锁和自旋等待 这些API统称为(松散地)称为PFX(并行框架).并行类与任务并行性构造一起被称为任务并行库或TPL. Framework 4.0还添加了许多针对传统多线程的较低级线程构造.我们之前介绍了这些内容: 低延迟信令构造(SemaphoreSlim,ManualResetEventSlim,Countdo…
#define NET45 namespace Test { using System; using System.Threading; using System.Threading.Tasks; using Microshaoft; class Program { static void Main() { GCNotifier.RegisterForFullGCNotification ( , (x) => { //if (x != GCNotificationStatus.Timeout)…
使用多线程可以利用多核CPU的计算能力,可以提供更好的程序响应能力,但是每个线程都有开销,需要注意控制线程的数量. 1. System.Threading.Thread 使用多线程最直接的是使用System.Threading.Thread.回调函数可以接受一个参数.或者不接受参数,没有返回值. Thread t = new Thread(Echo); t.Start("test"); t.Join(); t = new Thread(DoSomeThing); t.Start();…
前面看完了Task对象,这里再看一下另一个息息相关的对象Parallel. Parallel对象 Parallel对象封装了能够利用多核并行执行的多线程操作,其内部使用Task来分装多线程的任务并试图将它们分配到不同的内核中并行执行.请注意“试图”这个词,Parallel对象相当具有智能性,当它判断任务集并没有从并行运行中受益,就会选择按顺序运行.这样的做法是因为并非所有的项目都适合使用并行开发,创建过多并行任务可能会损害程序的性能,降低运行效率. Parallel对象是静态类,它主要有3个静态…