增加了兩個新關鍵字async和await,它們可用于基于任務的異步模式(TAP)
什麼是基于任務的異步模式呢?
這就要說到.NET 4.0新增加的Task類型,它可以讓我們更加友善的進行多線程開發。它提供了很多方法像開啟任務(Start,Run方法等),延續任務(ContinueWith),等待任務(Wait,WaitAll,WaitAny),取消任務(CancellationToken),延遲執行(Delay),條件執行(WhenAll,WhenAny)等。
通常能夠使用async和await的方法總是傳回Task<T>類型,下面的例子是Redis指令中一個判斷key是否存在的異步方法:
Task<bool> KeyExistsAsync(RedisKey key, CommandFlags flags = CommandFlags.None);
該方法傳回的是一個Task<bool>類型,我是這樣封裝它的:
/// <summary>
/// 判斷Key是否存在
/// </summary>
/// <param name="key"></param>
/// <param name="db"></param>
/// <returns></returns>
public async Task<bool> KeyExistsAsync(string key,int db)
{
return await RedisManager.ReadDataBase(db).KeyExistsAsync(key);
}
最終調用的例子如下:
RedisCommand command = new RedisCommand();
var flag = command.KeyExistsAsync("city", 1).Result;
.NET 4.5 的另一個新特性是 Zip 壓縮改進,可減少壓縮檔案的大小,進而可以減輕網絡帶寬的壓力,例子如下:
/// <summary>
/// 壓縮位元組數組
/// </summary>
/// <param name="str"></param>
public static byte[] Compress(byte[] inputBytes)
{
using (MemoryStream outStream = new MemoryStream())
{
using (GZipStream zipStream = new GZipStream(outStream, CompressionMode.Compress, true))
{
zipStream.Write(inputBytes, 0, inputBytes.Length);
zipStream.Close(); //很重要,必須關閉,否則無法正确解壓
return outStream.ToArray();
}
}
}
/// <summary>
/// 解壓縮位元組數組
/// </summary>
/// <param name="str"></param>
public static byte[] Decompress(byte[] inputBytes)
{
using (MemoryStream inputStream = new MemoryStream(inputBytes))
{
using (MemoryStream outStream = new MemoryStream())
{
using (GZipStream zipStream = new GZipStream(inputStream, CompressionMode.Decompress))
{
zipStream.CopyTo(outStream);
zipStream.Close();
return outStream.ToArray();
}
}
}
}