Atitit.異步編程 java .net php python js 的比較php
1. 1、異步任務,異步模式, APM模式,, EAP模式, TAP 1html
1.1. APM模式: BeginXXX/EndXXX, IAsyncResult 2java
1.2. EAP模式(基於事件的異步模式) 2python
2. 異步的實現機制::主要是經過線程and線程池實現的... 2編程
3. 異步編程的開發::當前都是經過api的,未來應該能夠使用註解方式 2c#
6. Java 通用異步編程api ExecutorService.submit() 3多線程
7. .net ::Begin/End模式 ( Invoke或者BeginInvoke,,) 3
7.1.1. ISynchronizeInvoke.BeginInvoke 方法 (System.ComponentModel) 4
7.2. .net 也有特定模塊異步api WebClient 5
7.3. C#5.0引入了兩個關鍵字async、await以提供一種更爲簡潔的異步方法調用模式。 5
7.4. 線程池如此方便,咱們怎麼使用線程池呢?能夠經過如下幾種方式: 6
7.4.1. 經過類方法ThreadPool.QueueUserWorkItem直接調用。 6
7.4.2. 經過.net Framework 4.0 引入的TPL(Task Parallel Library)任務並行庫。 6
7.4.3. 經過異步委託(BeginInvoke/EndInvoke)調用。 6
7.4.4. 經過BackgroundWorker, BackgroundWorker是WinForm, WPF下的一個控件,主要用於提供UI控件下的協做式取消,進度報告等。 6
8. PHP異步執行的經常使用方式 fscokopen()函數 6
異步任務是由一系列的事件處理器(EventHandler)和Event(事件)組成,EventHandlers之間的通信經過Event來實現。每個EventHandler佔用一個線程(Thread)。
什麼須要異步模式?所謂模式,實際上是一種方法,就跟上篇博客裏所講的,是從工程實踐中總結出來的解決類似或特定問題的一種慣用手段。常見的異步模式包括:
做者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
Windows Form
MethodNameAsync
Event
MethodNameAsync
Task/Task<Result>
當前支持註解的只有sevlet3 ... java async-supported
實現思路:不個java.net的api都使用起來...實現蘭...
And實現本身的api::::core.exeAsyn(Closue c)
中間,都能行上本身喜歡的api風格...
通用api比較代碼多...
特定api更簡化....
Executors.newSingleThreadExecutor().submit(new Callable
ExecutorService繼承自Executor,它的目的是爲咱們管理Thread對象,從而簡化併發編程,Executor使咱們無需顯示的去管理線程的生命週期,是JDK 5以後啓動任務的首選方式。
(其實現方法一共有四種,請參考DebugLZQ前面的博文:.NET異步編程總結----四種實現模式)。
Control.Invoke 方法 (Delegate) :在擁有此控件的基礎窗口句柄的線程上執行指定的委託。
Control.BeginInvoke 方法 (Delegate) :在建立控件的基礎句柄所在線程上異步執行指定委託。
Invoke或者BeginInvoke方 法都須要一個委託對象做爲參數。委託相似於回調函數的地址,所以調用者經過這兩個方法就能夠把須要調用的函數地址封送給界面線程。這些方法裏面若是包含了 更改控件狀態的代碼,那麼因爲最終執行這個方法的是界面線程,從而避免了競爭條件,避免了不可預料的問題。若是其它線程直接操做界面線程所屬的控件,那麼 將會產生競爭條件,形成不可預料的結果。
經過 Invoke 或者 BeginInvoke 去調用,二者的區別就是一個致使工做線程等待,而另一個則不會。
使用Invoke完成一個委託方法的封送,就相似於使用SendMessage方法來給界面線程發送消息,是一個同步方法。也就是說在Invoke封送的方法被執行完畢前,Invoke方法不會返回,從而調用者線程將被阻塞。
使用BeginInvoke方法封送一個委託方法,相似於使用PostMessage進行通訊,這是一個異步方法。也就是該方法封送完畢後立刻返回,不會等待委託方法的執行結束,調用者線程將不會被阻塞。可是調用者也能夠使用EndInvoke方法或者其它相似WaitHandle機制等待異步操做的完成。
可是在內部實現上,Invoke和BeginInvoke都是用了PostMessage方法,從而避免了SendMessage帶來的問題。而Invoke方法的同步阻塞是靠WaitHandle機制來完成的。
,那就是Control類上的異步調用BeginInvoke並無開闢新的線程完成委託任務,而是讓界面控件的所屬線程完成委託任務的。看來異步操做就是開闢新線程的說法不必定準確。
WebClient做爲WebRequest的高層封裝,.NET已經幫咱們把這個異步模式給封裝了
client.DownloadStringAsync(new Uri(uri));
private async void button1_Click(object sender, EventArgs e) { int length = await ShowUriContentAsyncAwait("http://www.cnblogs.com/DebugLZQ"); textBox1.Text = length.ToString(); } // async Task<int> ShowUriContentAsyncAwait(string uri) { using (WebClient client = new WebClient()) { string text = client.DownloadString(uri); return text.Length; } }
TPL中最主要的兩個類是Task和Parallel。而新版C++標準中也引入了相似的概念parallel_for, parallel_foreach, parallel_invoke等。
詳細信息見如下連接。
韓式java的比較佳,,命名比較好的....
Invoke和BeginInvoke的使用(轉載)_oDEo_新浪博客.htm
paip.c#.net 多線程調用控件的問題 - attilax的專欄 - 博客頻道 - CSDN.NET.htm
paip.C#.NET多線程訪問 toolStripStatusLabel - .NET教程_.NET編程_.NET開發技術文章 - 紅黑聯盟.htm
關於對java異步編程的思考。 - Martin.Chen - 博客園.htm
NET異步編程總結----四種實現模式 - DebugLZQ - 博客園.htm
從C#5.0提及:再次總結C#異步調用方法發展史 - DebugLZQ - 博客園.htm
PHP異步執行的經常使用方式 - bravezhe的專欄 - 博客頻道 - CSDN.NET.htmpython 網絡編程----非阻塞或異步編程-bj2008_0201-ChinaUnix博客.htm
C#下的異步編程及其同步機制 - salomon - 博客園.htm
paip.java 多線程參數以及返回值Future FutureTask 的使用. - attilax的專欄 - 博客頻道 - CSDN.NET.htm
Servlet3.0新特性,Servlet3新特性,Servlet3註解,Servlet3異步處理【蕃薯耀】 - 蕃薯耀 - ITeye技術網站.htm