高並發的幾種處理方法


並發(英文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;
}
 
 
異步方法的返回類型只能是 voidTaskTask<TResult>。示例中異步方法的返回值類型是 Task
 
async來修飾一個方法,表明這個方法是異步的,聲明的方法的返回類型必須為:voidTaskTask<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。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM