1. 程式人生 > >C#新特性

C#新特性

ren 理解 4.0 特性 for 線程 tap 解決 thread

4.0 VS2010 .Net 4.0

System.Threading.Tasks.Task

Task對象是.Net Framework 4.0之後出現的異步編程的一個重要對象。在一定程度上來說,Task對象可以理解Thread對象的一個升級產品。既然是升級產品,那它肯定有他的優勢,比如我們上面Thread對象不能解決的問題:對於有返回值類型的委托。Task對象就能簡單的解決。

//用法一
Task task1 = new Task(new Action(MyAction));
//用法二
Task task2 = new Task(delegate { MyAction(); });
//用法三
Task task3 = new Task(() => MyAction());
Task task4 = new Task(() => { MyAction(); });
task1.Start();
task2.Start();
task3.Start();
task4.Start();

var strRes = Task.Run<string>(() => { return GetReturnResult(); });//啟動Task執行方法
Console.WriteLine("執行GetReturnResult方法後的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
Console.WriteLine(strRes.Result);//得到方法的返回值

5.0 VS2012 .Net 4.5

async和await

在.Net 4.5中,通過async和await兩個關鍵字,引入了一種新的基於任務的異步編程模型(TAP)。在這種方式下,可以通過類似同步方式編寫異步代碼,極大簡化了異步編程模型。

static async Task TestAsync()
{
Console.WriteLine("調用GetReturnResult()之前,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
var name = GetReturnResult();
Console.WriteLine("調用GetReturnResult()之後,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
Console.WriteLine("得到GetReturnResult()方法的結果:{0}。當前時間:{1}", await name, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));
}

await name 等價於 name.GetAwaiter().GetResult()

在lambdas中使用循環變量

在C#之前的版本中,如果你編寫了一個循環,你不能在lambda中使用循環變量。事實上,它比想象中更糟。你可以在lambda中使用循環變量,但是它將給你一個錯誤的結果。它會使用循環退出時的變量值,不是被捕獲時的值。

public static List<Func<int, int>> GetAdders(params int[] addends) {
var funcs = new List<Func<int, int>>();
foreach (int addend in addends) {
funcs.Add(i => i + addend);
}
return funcs;
}

C#新特性