学习书籍: <C#本质论>

1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq).

其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式).

--用AggregateException处理Task上的未处理异常.

--取消任务. CancellationToken

--async修饰方法, 返回Task. task.wait(100)可以阻塞现场. async方法内await 启线程执行.

==> 第一部分, 5.0推荐的线程使用方式.

2--学习了Task 等线程同步使用方式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Task1
{
class Program
{
const int _Total = 99999;
static long _Count = 0;
readonly static object _Sync = new Object();
static void Main(string[] args)
{
//Task task = Task.Run(()=>Decrement());
//for (int i = 0; i < _Total; i++)
//{
// _Count++;
//}
//task.Wait();
//Console.WriteLine("Count = {0}", _Count);
//CountAsync();
//int x = 0;
//Parallel.For(0, 999999, i =>
// {
// x++;
// x--;
// });
//Console.WriteLine("Count = {0}",x);
Task task = Task.Run(() => Decrement());
for (int i = 0; i < _Total; i++)
{
bool lockTaken = false;
try
{
Monitor.Enter(_Sync, ref lockTaken);
_Count++;
}
finally
{
if (lockTaken)
{
Monitor.Enter(_Sync);
}
}
}
task.Wait();
Console.WriteLine("Count = {0}", _Count);
Console.ReadKey();
}
public static async void CountAsync()
{
Task task = Task.Run(() => Decrement());
for (int i = 0; i < _Total; i++)
{
_Count++;
}
await task;
Console.WriteLine("Count = {0}", _Count);
}
static void Decrement()
{
for (int i = 0; i < _Total; i++)
{
bool lockTaken = false;
try
{
Monitor.Enter(_Sync, ref lockTaken);
_Count--;
}
finally
{
if (lockTaken)
{
Monitor.Exit(_Sync);
}
}
}
}
}
}

==> 第二部分.

TPL和C#5.0之前的多线程模式
1. 调用APM
#region
String url = "www.baidu.com";
if (args.Length > 0)
{
url = args[0];
}
Console.WriteLine(url);
WebRequest webRequest = WebRequest.Create(url);
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
while(!asyncResult.AsyncWaitHandle.WaitOne(100))
{
Console.Write(".");
}
WebResponse response = webRequest.EndGetResponse(asyncResult);
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
int length = reader.ReadToEnd().Length;
Console.WriteLine(length);
}

2-- 复杂带状态的操作

1--CPS 连续调用样式. 的fire-and-forget模式. 减少了直接再beginXXX方法后调用EndXXX方法.

通过CPS,"登记"异步方法结束时执行的代码.

3-- 在APM方法间传递状态

1--可以通过Lambda完成委托BeginXXX调用.

C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)的更多相关文章

  1. 三、基于任务的异步模式(TAP),推荐使用

    一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...

  2. 15.6.1 【Task使用】基于任务的异步模式

    C# 5异步函数特性的一大好处是,它为异步提供了一致的方案.但如果在命名异步方法以及 触发异常等方面做法存在着差异,则很容易破坏这种一致性.微软因此发布了基于任务的异步模 式(Task-based A ...

  3. 【转】学习Flex ActionScript 3.0 强烈推荐电子书

    学习Flex ActionScript 3.0 强烈推荐电子书 AdvancED ActionScript 3.0 Animation(<Make things  move>姐妹篇,强烈推 ...

  4. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  5. Task的异步模式

    Task的异步模式 返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的 ...

  6. 数据流(任务并行库 TPL)

    TPL 数据流库向具有高吞吐量和低滞后时间的占用大量 CPU 和 I/O 操作的应用程序的并行化和消息传递提供了基础. 它还能显式控制缓存数据的方式以及在系统中移动的方式. 为了更好地了解数据流编程模 ...

  7. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  8. 实现基于Task的异步模式

    返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...

  9. C#深度学习のTask(基于任务的异步模型)

    一.Task关键字解释 Task 类的表示的单个操作不会返回一个值,通常以异步方式执行. Task 对象是一种的中心思想 基于任务的异步编程模式 首次引入.NET Framework 4 中. 因为由 ...

随机推荐

  1. iOS语音播放之切换听筒和扬声器的方法解决方案

    关于流媒体播放的相关知识可以加本人QQ:564702640 一起来讨论 [[UIDevice currentDevice] setProximityMonitoringEnabled:YES]; // ...

  2. ltt.js

    var dailyBox = $('.daily-box-office'), curDate = new Date(), curYear = curDate.getFullYear(), curMon ...

  3. android侧滑菜单笔记

    一.SlidingPaneLayout v4包下的控件,使用简单,功能简洁.官方文档明确说明该控件只能左侧滑动.使用如下: <android.support.v4.widget.SlidingP ...

  4. Java循环语句 for

    语法: 特点:相比 while 和 do...while 语句结构更加简洁易读 例如,输出 1000 遍"我爱慕课网",使用 for 的实现代码为: 需要留心的几个小细节: 1. ...

  5. 一个通用数据库访问类(C#,SqlClient)

    本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...

  6. 1.(1)编写一个接口ShapePara,要求: 接口中的方法: double getArea():获得图形的面积。double getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara。 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径。 x:private修饰的dou

    package jiekou1; public interface ShapePara { //定义常量PI final double PI=3.14; //定义抽象方法 //获得图形面积 doubl ...

  7. SVN遇到的几个错误问题解决办法

    1.svn更新被锁 清理之后陷入死循环问题 Attempted to lock an already-locked dir svn: Working copy 'E:\Workspaces\eclip ...

  8. TFS上使用Beyond Compare来比较源码

    In Visual Studio, go to the Tools menu, select Options, expand Source Control, (In a TFS environment ...

  9. UITextfield设置Placeholder颜色 控件 内边距、自适应高度

    //创建UITextField对象 UITextField * tf=[[UITextField alloc]init];    //设置Placeholder颜色 [text setAttribut ...

  10. Java连接MYSQL【转载】

    这篇文章主要以MySQL为例讲下Java如何连接到数据库的. 当然,首先要安装有JDK(一般是JDK1.5.X).然后安装MySQL,这些都比较简单,具体过程就不说了.配置好这两个环境后,下载JDBC ...