使用enumerator模式簡化非同步操作

2021-09-22 07:06:44 字數 2502 閱讀 3401

先看一段同步**:

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...