先看一段同步**:
public
int sumpagesizes(ilist
uris) bytes ...", total);
var data = new
webclient().downloaddata(uri);
total += data.length;
} statustext.text = string.format("found bytes total", total);
return total; }
這段**比較簡單,使用同步方式乙個乙個的獲取
uri的
data
,然後進行統計。
如果要使用非同步方式乙個乙個的統計,那應該如何計算呢?
我以前演示過一段醜陋的**大致如下:
webclient
webclient = new
webclient();
webclient.downloaddatacompleted += (s, e) =>
; webclient2.downloaddataasync(new
uri("b
的位址"
));
};
webclient.downloaddataasync(new
uri("a
的位址"
));
當然如果你確定只有兩個位址的話,這種方法未嘗不可。如果有多個位址的話,則必須遞迴的呼叫了。
如何使用
enumerator
來簡化非同步操作:
public
void sumpagesizesasync(ilist
uris)
private
void sumpagesizesasynchelper(ienumerator
enumerator, int total) bytes ...", total);
var client = new
webclient();
client.downloaddatacompleted += (sender, e) => ;
client.downloaddataasync(enumerator.current);
} else bytes total", total);
enumerator.dispose(); } }
通過sumpagesizesasynchelper
,可以實現非同步呼叫
a->
非同步呼叫
b->
非同步呼叫
c..的方式。
首先解釋下為什麼可以,假設
uris
有a,b,c.
sumpagesizesasynchelper(uris.getenumerator(), 0);
方法先呼叫
a,因為
a後面還有
b,所以
enumerator.movenext()
返回true,
接著在downloaddatacompleted
事件結束後,呼叫
b,同樣,因為
b後面還有c,
所以enumerator.movenext()
繼續返回
true
,接著在
downloaddatacompleted
事件後呼叫c。
在呼叫c
結束後,因為
c後面沒有了,所以
enumerator.movenext()
返回false,
如果使用
async
和await
來實現的話,**如下:
public
async
task
sumpagesizesasync2(ilist
uris)
:呼叫的位址found bytes...",
thread.currentthread.managedthreadid, chartext, total, datetime.now);
chartext = convert.tochar(chartext + 1);
}
console.writeline("thread id: :
全部完成
,found bytes total ",
thread.currentthread.managedthreadid, total, datetime.now);
return total;
}
簡說狀態模式
在狀態模式中,抽象狀態介面,定義統一的方法型別。子類實現該介面,補充具體的實現行為。乙個物件類,內部有狀態例項,並且有切換狀態的成員函式。當接收到外界的值 改變因素 時,在物件類的內部實現動態的狀態切換。塊 狀態模式 public class test 具體狀態實現a class statea im...
最簡設計模式
設計模式應用舉例 剛開始學 剛開始學習設計模式的時候,感覺很興奮,這東西太好了。困惑 當時學完後,不知道如何用。甚至自己用過了也不知道自己用過了。於是我想 學這東西到底有什麼用呢,到底如何才算學會呢?領悟 後來我明白了,其實設計模式只是面上物件應用的一些典型案例,模式的價值在於對物件導向屬性的巧妙運...
Flux模式簡析
相比mvc模式,flux多出了更多的箭頭跟圖示,但是有個關鍵性的差別是 所有的剪頭都指向乙個方向,在整個系統中形成乙個閉環。shut up and show me the code 這裡主要分析dispatcher檔案 複製 dispatcher檔案初始化 var invariant require...