Weitere ähnliche Inhalte Ähnlich wie Async programming on NET (20) Kürzlich hochgeladen (15) Async programming on NET9. var request = HttpWebRequest.Create(“http://yuyijq.cnblogs.com”); request. BeginGetResponse (DownloadCompeleted,request); public void DownloadCompeleted(IAsyncResult ar) { var request = (HttpWebRequest)ar.AsyncState; var response = request. EndGetResponse (); var stream = response.GetResponseStream(); ReadHelper(stream); } public void ReadHelper(Stream stream) { byte[] buffer = new byte[1024]; stream.BeginRead(buffer,0,1024,(ar) =>{ var actualRead = stream.EndRead(); if(actualRead == 0){ stream.Close(); }else{ //proccess data ReadHelper(stream); } },null); } 12. Print(Add(5,6)) void Print(int result) { Console.WriteLine(result); } int Add(int l, int r) { return l + r; } Add(5, 6, (ret) => Print(ret)); void Add(int l, int r, Action<int> continue) { continue(l + r); } 13. 神奇的 yield Private IEnumerator<int> Caclute() { int i = 5 + 6; yield return 1; Console.WriteLine(i); i = 4 * 5; yield return 1; Console.WriteLine(i); //… } Private Ienumerator<int> Caclute() { return new StateMachine(); } Public class StateMachine { public bool MoveNext() { switch(state) { case 0: //… } } } While(Caclute().MoveNext()){ //… } 14. 如是我们可以这样编写异步代码: Private Ienumerator<int> Download() { var req = HttpWebRequest.Create(“http://yuyijq.cnblogs.com”); var ar1 = req.BeginGetResponse(__?__,null); yield return 1; var resp = req.EndGetResponse(ar1); using(var stream = resp.GetResponseStream()) { byte[] buffer = new byte[1024]; do{ var ar2 =stream.BeginRead(buffer,0,1024,__?__,null); yield return 1; var actualRead = stream.EndRead(ar2); }while(actualRead != 0) } } self.MoveNext self.MoveNext 15. AsyncRunner runner = new AsyncRunner(); Runner.Run(Download(runner)); Public void Run(Ienumerator<int> async) { this.async = async; async.MoveNext(); } Public AsyncCallback Continue() { return (ar) => this.async.MoveNext(); } 16. Private Ienumerator<int> Download(AsyncRunner runner) { var req = HttpWebRequest.Create(“http://yuyijq.cnblogs.com”); var ar1 = req.BeginGetResponse( runner.Continue ,null); yield return 1; var resp = req.EndGetResponse(ar1); using(var stream = resp.GetResponseStream()) { byte[] buffer = new byte[1024]; do{ var ar2 =stream.BeginRead(buffer,0,1024, runner.Continue ,null); yield return 1; var actualRead = stream.EndRead(ar2); }while(actualRead != 0) } } 19. F# ASYNC WORKFLOW def download url = async{ let req = WebRequest.Create(url) let! resp = req.AsyncGetResponse() use stream = resp.GetResponseStream() use reader = new StreamReader(stream) let! content = reader.AsyncReadToEnd() return content } builder.Delay( var req = WebRequest.Create(url); builder.Bind(req.AsyncGetReponse(),(resp) =>{ builder.Using(resp.GetResponseStream(),(stream) =>{ builder.Using(new StreamReader(stream),(reader) =>{ builder.Bind(reader.AsyncReadToEnd(),(content) =>{ builder.Return(content); }) }) }) }) ); 20. F# WORKFLOW type Async<‘T> type AsyncBuilder with member Return : ‘T -> Async<‘T> member Delay : (unit -> Async<‘T>) -> Async<‘T> member Using : ‘T * (‘T -> Async<‘U>) -> Async<‘U> when ‘T :> System.Idisposable member Bind : Async<‘T> * (‘T -> Async<‘U>) -> Async<‘U> let async = new AsyncBuilder async{ let!... } 21. .NET 5.0 TAP Public async String Download(String url) { var req = WebRequest.Create(url); var resp = await req.GetResponseAsync(); using(var stream = resp.GetResponseStream()) { } }