第05章-異步編程_第1頁
第05章-異步編程_第2頁
第05章-異步編程_第3頁
第05章-異步編程_第4頁
第05章-異步編程_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

工業(yè)和信息化部“十二五”規(guī)劃教材

普通高等學校“十二五”規(guī)劃教材

《C#網(wǎng)絡應用編程》第3版

第5章異步編程2Ch5異步編程5.1并行和異步編程預備知識5.2異步編程基本技術5.1并行和異步編程預備知識5.1.1任務(Task類、Task<TResult>類)5.1.2Lambda表達式5.1.3Action和Func委托5.1.4元組(Tuple類)45.1.1任務(Task類、Task<TResult>類)1.Task類2.Task<TResult>類3.Task.Delay方法Delay(Int32)//延時指定的毫秒數(shù)Delay(TimeSpan)//延時指定的時間(年、月、日、時、分、秒、毫秒等)Delay(Int32,CancellationToken)//延時指定的毫秒數(shù)后取消任務操作Delay(TimeSpan,CancellationToken)//延時指定的時間后取消任務操作5.1.2Lambda表達式1.基本用法定義(輸入?yún)?shù)列表)=>{表達式或語句塊}x=>x*x(x,y)=>x==y(intx,strings)=>s.Length>x()=>SomeMethod()5.1.2Lambda表達式2.在LINQtoObjects中使用Lambda表達式Microsoft.NET框架List<int>numberList=newList<int>{5,4,1,3,9,8,6,7,2,0};varq1=numberList.Where(i=>i<4);List<int>numberList=newList<int>{5,4,1,3,9,8,6,7,2,0};varq2=fromiinnumberListwherei<4selecti;5.1.2Lambda表達式3.示例5.1.3Action和Func委托1.一般形式Action<[T1,T2,……,T16]>Func<[T1,T2,……,T16,]TResult>5.1.3Action和Func委托2.基本用法classProgram{staticvoidMain(string[]args){Action<string>a=ShowMessage;a("OK");Console.ReadKey();}privatestaticvoidShowMessage(stringmessage){Console.WriteLine(message);}}5.1.3Action和Func委托3.示例5.1.4元組(Tuple類)元組是一種數(shù)據(jù)結構,其中的元素具有固定的數(shù)目和序列,在.NET框架中,可通過Tuple.Create方法直接創(chuàng)建具有1到7個元素的元組,另外,還可以通過嵌套的元組創(chuàng)建具有更多元素的對象。元組中的元素可通過Tuple對象的ItemN(N=1,2,3,……,7)屬性得到。表示一組數(shù)據(jù)。提供對數(shù)據(jù)集的輕松訪問和操作。在方法的參數(shù)傳遞中不使用out修飾符就可以返回多個值。用1個參數(shù)就可以將多個值傳遞給某個方法。5.2異步編程基本技術5.2.1異步編程的實現(xiàn)方式和異步操作關鍵字5.2.2創(chuàng)建任務5.2.3取消或終止任務的執(zhí)行5.2.4獲取任務執(zhí)行的狀態(tài)5.2.5報告任務執(zhí)行的進度5.2.6定時執(zhí)行某些任務5.2.1異步編程的實現(xiàn)方式和異步操作關鍵字1.異步編程的實現(xiàn)方式(1)傳統(tǒng)的異步編程模型(APM)(2)基于事件的異步編程設計模式(EAP)(3)基于任務的異步模式(TAP)(4)改進的基于任務的異步模式(async、await、Task.Run和TAP)5.2.1異步編程的實現(xiàn)方式和異步操作關鍵字2.異步操作關鍵字(1)異步方法和異步事件處理程序(2)async修飾符如果方法沒有返回值,則用async和Task共同簽名。如果方法有返回值,則用async和Task<int>共同簽名。(3)await運算符(4)異步方法的命名約定5.2.2創(chuàng)建任務1.定義任務執(zhí)行的方法(1)用普通方法定義任務(2)用異步方法定義任務(3)用匿名方法定義任務5.2.2創(chuàng)建任務2.利用Task.Run方法隱式創(chuàng)建和執(zhí)行任務Run(Func<Task>)//用默認調度程序在線程池中執(zhí)行不帶返回值的任務Run<TResult>(Func<Task<TResult>>)//用默認調度程序在線程池中執(zhí)行帶返回值的任務Run(Func<Task>,CancellationToken)//執(zhí)行任務過程中可偵聽取消通知Run<TResult>(Func<Task<TResult>>,CancellationToken)//執(zhí)行任務過程中可偵聽取消通知5.2.2創(chuàng)建任務5.2.2創(chuàng)建任務3.利用async和await關鍵字隱式創(chuàng)建異步任務5.2.2創(chuàng)建任務4.利用WPF控件的調度器隱式創(chuàng)建和執(zhí)行任務5.2.2創(chuàng)建任務5.通過顯式調用Task或Task<TResult>的構造函數(shù)創(chuàng)建任務(1)Task類的構造函數(shù)(2)Task<TResult>類的構造函數(shù)5.2.3取消或終止任務的執(zhí)行1.基本概念.NET框架引入的CancellationTokenSource類和CancellationToken結構用于協(xié)同實現(xiàn)多個線程、線程池工作項或Task對象的取消操作5.2.3取消或終止任務的執(zhí)行2.CancellationTokenSource類和CancellationToken結構System.Threading.CancellationTokenSource用于創(chuàng)建取消通知,稱為取消源。System.Threading.CancellationToken結構用于傳播應取消操作的通知,稱為取消令牌。執(zhí)行任務的方法接收到取消通知后,可以用以下方式之一終止操作:(1)在任務代碼中,簡單地從委托中返回。(2)在任務代碼中,引發(fā)OperationCanceledException異常,并將其傳遞到在其上請求了取消的標記。5.2.3取消或終止任務的執(zhí)行3.基本用法

5.2.4獲取任務執(zhí)行的狀態(tài)1.冷任務和熱狀態(tài)用Task類或者Task<TResult>類的構造函數(shù)顯式創(chuàng)建的任務稱為冷任務(coldtask),冷任務必須通過Start方法來啟動。任務在生命周期內的執(zhí)行情況稱為熱狀態(tài)。5.2.4獲取任務執(zhí)行的狀態(tài)2.Status屬性和TaskStatus枚舉利用任務實例的Status屬性獲取任務執(zhí)行的狀態(tài)。任務執(zhí)行的狀態(tài)用TaskStatus枚舉表示。TaskStatus的枚舉值有:Created:該任務已初始化,但尚未進入調度計劃。WaitingForActivation:該任務已進入調度計劃,正在等待被調度程序激活。WaitingToRun:該任務已被調度程序激活,但尚未開始執(zhí)行。Running:該任務正在運行,但尚未完成。RanToCompletion:該任務已成功完成。Canceled:該任務由于被取消而完成(任務自身引發(fā)OperationCanceledException異常,或者在該任務執(zhí)行之前調用方已向該任務的CancellationToken發(fā)出了信號)。Faulted:該任務因為出現(xiàn)未經(jīng)處理的異常而完成。WaitingForChildrenToComplete:該任務本身已完成,正等待附加的子任務完成。3.任務完成情況相關的屬性(1)IsCompleted屬性(2)IsCanceled屬性(3)IsFaulted屬性(4)取消和完成之間的關系5.2.4獲取任務執(zhí)行的狀態(tài)5.2.4獲取任務執(zhí)行的狀態(tài)4.示例5.2.5報告任務執(zhí)行的進度有時候我們可能希望讓某些異步操作提供進度通知,以便在界面中顯示異步操作執(zhí)行的進度,這種情況下,可以用Progress<T>類報告任務執(zhí)行的進度。Progress<T>類是通過IProgress<T>接口來實現(xiàn)的,該類的聲明方式如下:publicclassProgress<T>:IProgress<T>{publicProgress();publicProgress(Action<T>handler);protectedvirtualvoidOnReport(Tvalue);publiceventEventHandler<T>ProgressChanged;}5.2.5報告任務執(zhí)行的進度5.2.6定時執(zhí)行某些任務1.System.Timers.Timer類System.Timers.Timer類可與可視化設計器一同使用,該類可以引發(fā)事件,但它默認是在線程池線程中引發(fā)事件,而不是在當前線程中引發(fā)事件。System.Timers.Timer類的常用屬性和方法如下:AutoReset屬性:獲取或設置一個布爾型的值,該值為true表示每次間隔結束時都引發(fā)一次Elapsed事件,false表示僅在首次間隔結束時引發(fā)一次該事件。Interval屬性:獲取或設置兩次Elapsed事件的間隔時間(以毫秒為單位)。該值必須大于零并小于或等于Int32.MaxValue。默認值為100毫秒。Start方法:啟動定時器。Stop方法:停止計時器。5.2.6定時執(zhí)行某些任務2.System.Windows.Threading.DispatcherTimer類在客戶端WPF應用程序中,對于需要與用戶界面交互的任務,最簡單的方式是使用System.Windows.Threading命名空間下的DispatcherTimer類來實現(xiàn),這種定時器也是用時間模型來實現(xiàn)的,但它是在與當前線程關聯(lián)的線程中定時執(zhí)行任務,因此利用這種定時器可以直接獲取或修改界面控件的屬性。另外,該對象的定時效果沒有System.Timers.Timer的定時精確,所以最好不要將其用于針對服務器的定時操作。5.2.6定時執(zhí)行某些任務3.System.Threading.Timer類System.Threading.Timer類也是在線程池中定時執(zhí)行任務,它與其他兩種計時器的區(qū)別是該類不使用事件模型,而是直接通過調用TimerCallback類型的委托來實現(xiàn)。該類的構造函數(shù)語法為publicTimer(TimerCallbackcallback,//一個TimerCallback類型的委托,表示要執(zhí)行的方法Objectstate,//一個包含回調方法要使用的信息的對象,可以為nullT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論