並發(英文Concurrency),其實是一個很泛的概念,字面意思就是“同時做多件事”,不過方式有所不同。在.NET的世界里面,處理高並發大致有以下幾種方法:
1,異步編程 在.NET 4.5 及以上框架中引入的async/await關鍵字(這個算是我們用的比較多的)
看代碼例子:
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("111 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
AsyncMethod();
Console.WriteLine("222 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
}
private async Task AsyncMethod()
{
var ResultFromTimeConsumingMethod = TimeConsumingMethod();
string Result = await ResultFromTimeConsumingMethod + " + AsyncMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(Result);
//返回值是Task的函數可以不用return
}
//這個函數就是一個耗時函數,可能是IO操作,也可能是cpu密集型工作。
private Task<string> TimeConsumingMethod()
{
var task = Task.Run(()=> {
Console.WriteLine("Helo I am TimeConsumingMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
Console.WriteLine("Helo I am TimeConsumingMethod after Sleep(5000). My Thread ID is :" + Thread.CurrentThread.ManagedThreadId);
return "Hello I am TimeConsumingMethod";
});
return task;
}
異步方法的返回類型只能是
void、
Task、
Task<TResult>。示例中異步方法的返回值類型是
Task
用async來修飾一個方法,表明這個方法是異步的,聲明的方法的返回類型必須為:void或Task或Task<TResult>。方法內部必須含有await修飾的方法,如果方法內部沒有await關鍵字修飾的表達式,哪怕函數被async修飾也只能算作同步方法,執行的時候也是同步執行的。
這個例子:
private async void button1_Click(object sender, EventArgs e)
{
var t = Task.Run(() => {
Thread.Sleep(5000);
return "Hello I am TimeConsumingMethod";
});
textBox1.Text = await t;
}
看到沒,驚不驚喜,意不意外,寥寥幾行就搞定了,不用再多寫那么多函數,使用起來也很靈活。最讓人頭疼的跨線程修改控件的問題完美解決了,再也不用使用Invoke了,因為修改控件的操作壓根就是在原來的線程上做的,還能不阻塞UI。
