1. 程式人生 > >C#並發編程實例講解-概述(01)

C#並發編程實例講解-概述(01)

一個 運行 最簡 用戶 方便 響應 心理 .net 4.5 target

在工作中經常遇到需要並發編程的實例,一直沒有時間來整理,現在空了下來,個人整理對並發一下理解。

關於並發編程的幾個誤解

  • 誤解一:並發編程就是多線程
    實際上多線只是並發編程的一中形式,在C#中還有很多更實用、更方便的並發編程技術,包括異步編程、並行編程、TPL數據流、響應式編程等。
  • 誤解二:只有大型服務器程序才需要考慮並發
    服務器端的大型程序要響應大量客戶端的數據請求,當然要充分考慮並發。但是桌面程序和手機、平板等移動端應用同樣需要考慮並發編程,因為它們是直接面向最終用戶的,而現在用戶對使用體驗的要求越來越高。程序必須能隨時響應用戶的操作,尤其是在後臺處理時(讀寫數據、與服務器通信等),這正是並發編程的目的之一。
  • 誤解三:並發編程很復雜、必須掌握很多底層技術
    C# 和 .NET 提供了很多程序庫,並發編程已經變得簡單多了。尤其是 .NET 4.5 推出了全新的 async 和 await 關鍵字,使並發編程的代碼減少到了最低限度。

並發

最簡單明了的解釋:同時做多件事情,這個解釋表明了並發的作用,服務器應用利用並發就,在處理第一個請求的同時響應第二個請求。只要你希望程序能同時做多件事情,你就需要並發。所以幾乎每個軟件程序都會受益於並發。

多線程

很多人看到並發 就會想到多線程 ,這裏解釋一下,多線程它只是並發的一種形式,它采用多個線程來執行程序,其中分為主線程和子線程之分。執行程序的第一句話就會開啟一個主線程,主線程可以創建子線程來實現並發。多線程是並發的一種形式,但不是唯一的形式。實際上,直接使用底層線程類型在現代程序基本不起作用。比起老式多線程,采用高級抽象機制會讓功能更加強大。效率更高。這裏也就是不會再使用Thread或BackgroundWorker。比如你的代碼輸入new Thead()

,說明項目中的代碼過時了。但是,不要認為多線程已經徹底被淘汰了!因為線程池要求多線程繼續存在。線程池存放任務的隊列,這個隊列能夠根據需要自行調整。相應地,線程池產生了另一個重要的並發形式:並行處理

並行處理

把正在執行的大量的任務分割成小塊,分配給多個同時運行的線程。為了讓處理器的利用效率最大化,並行處理(或並行編程)采用多線程。當現代多核 CPU執行大量任務時,若只用一個核執行所有任務,而其他核保持空閑,這顯然是不合理的。並行處理把任務分割成小塊並分配給多個線程,讓它們在不同的核上獨立運行。並行處理是多線程的一種,而多線程是並發的一種。在現代程序中,還有一種非常重要但很多人還不熟悉的並發類型:異步編程

異步編程

並發的一種形式,和多線程同級,它一般采用回調(callback)機制,以避免產生不必要的線程。
在.NET中,新版有Task和Task.以前一般是回調或事件event.異步編程的核心理念是異步操作:啟動了的操作將會在一段時間後完成。這個操作正在執行時,不會阻塞原來的線程。啟動了這個操作的線程,可以繼續執行其他任務。當操作完成時,會通知他的回調函數,以便讓程序知道操作已經結束NET4.5已經支持async和await,讓異步變得和同步編程一樣容易。await關鍵字的作用:啟動一個將會被執行的Task(該Task將會在新線程中執行),並立即返回,所以await所在的函數不會被阻塞。當Task完成後,繼續執行await關鍵字後面的代碼

響應式編程

一種聲明式的編程模式,程序在該模式中對事件做出響應。如果把一個程序看作一個大型的狀態機,則該程序的行為便可視為它對一系列事件做出響應,即每換一個事件,它就更新一次自己的狀態。這聽起來很抽象和空洞,但實際上並非如此。利用現代的程序框架,響應式編程已經在實際開發中廣泛使用。響應式編程不一定是並發的,但它與並發編程聯系緊密。
通常情況下,一個並發程序要使用多種技術。大多數程序至少使用了多線程(通過線程池)和異步編程。要大膽地把各種並發編程形式進行混合和匹配,在程序的各個部分使用合適的工具。

本文版權歸作者共有,歡迎轉載,須保留此段聲明,並給出原文鏈接,謝謝!

C#並發編程實例講解-概述(01)