C#非同步程式設計和await/async
阿新 • • 發佈:2019-02-08
關鍵字:APM(1.0)、EAP(2.0)、TAP(4.0)、async/await(4.5)
在.NET 1.0開始微軟就對非同步程式設計做了相應的支援——即非同步程式設計模型(APM), 之後在.NET 2.0中又提出了基於事件的非同步程式設計模型(EAP),.NET 4.0中又提出了基於任務的非同步程式設計模型(TAP),在.NET 4.5(對應於C#5.0)中提供了async和await兩個關鍵字。
以下程式碼提供了三個.net版本的非同步程式設計參考
void Test()
{
int i = 0;
while (i < 100 )
{
this.lbl.Dispatcher.Invoke(new Action(() => this.lbl.Content = i.ToString()));
Thread.Sleep(10);
i++;
}
}
/// <summary>
/// .net framework 1.0版本支援的非同步程式設計,IsBackground關鍵字及執行緒池兩種方式
/// </summary>
void Async_Net_v1()
{
new Thread(Test) { IsBackground = false }.Start(); //.Net 在1.0的時候,就已經提供最基本的API.
ThreadPool.QueueUserWorkItem(o => Test()); //執行緒池中取空閒執行緒執行委託(方法)
}
/// <summary>
/// .net framework 4.0版本提供了task
/// </summary>
void Async_Net_v4()
{
Task.Run((Action)Test); //.Net 4.0以上可用
}
/// <summary>
/// .net frameword 4.5引入await和async關鍵字
/// </summary>
async void Async_Net_v45()
{
await Task.Run(new Action(Test));
}
private void btn_Click(object sender, RoutedEventArgs e)
{
Async_Net_v1();
}
private void btnV4_Click(object sender, RoutedEventArgs e)
{
Async_Net_v4();
}
private void btnv45_Click(object sender, RoutedEventArgs e)
{
Async_Net_v45();
}
C# 版本和.NET 版本對應關係:
C# 版本 |
.NET Framework版本 |
Visual Studio版本 |
釋出日期 |
特性 |
C# 1.0 |
.NET Framework 1.0 |
Visual Studio .NET 2002 |
2002.1 |
APM |
C# 1.1 |
.NET Framework 1.1 |
Visual Studio .NET 2003 |
2003.4 |
|
C# 2.0 |
.NET Framework 2.0 |
Visual Studio 2005(開始命名為Visual Studio) |
2005.11 |
|
C# 3.0 |
.NET Framework 3.0 .NET Framework 3.5 |
Visual Studio 2008 |
2007.11 |
|
C# 4.0 |
.NET Framework 4.0 |
Visual Studio 2010 |
2010.4 |
|
C# 5.0 |
.NET Framework 4.5 |
Visual Studio 2012 |
2012.8 |
非同步和等待(async和await) 呼叫方資訊 (Caller Information) (在mvvm中非常有用 [CallerMemberName] string propertyName = null) |