List和Queue使用過程中的紀錄

2022-01-12 19:59:03 字數 3091 閱讀 5085

業務需求: 傳送特定的請求,根據返回的資訊執行特定的事件。

目前的做法:把我的請求放入乙個容器內,然後待到某一條件,就從這個容器把請求傳送出去,等客戶返回資訊時,查詢容器中對應請求中特定的事件。開始的時候我使用 list .其中遇到一些問題,紀錄一下

1 namespace collsecexp

2 12

13 thread t1 = new thread(() =>

14 ", item);

18 thread.sleep(1000);

19 }

20 });

21 t1.start();

2223 thread t2 = new thread(() =>

24 ", item);

31 }

32 });

33 t2.start();

34 }

35 }

36 }

執行會丟擲invalidoperationexception異常,提示「集合已修改;可能無法執行列舉操作。」

這是因為,執行緒2移除index=1,3的元素導致集合被修改。使用加鎖

1 namespace collsecexp

2 13

14 thread t1 = new thread(() =>

15 ", item);

21 thread.sleep(1000);

22 }

23 }

24 });

25 t1.start();

2627 thread t2 = new thread(() =>

28 ", item);

37 }

38 }

39 });

40 t2.start();

41 }

42 }

43 }

加鎖就可以解決了。

後來使用了想起了對於請求,我們可以使用佇列,最簡單的請求queue如下 

1

static

void main(string args)

2

1516 });

1718 ;

19 task.factory.startnew(() =>

20

28 }

2930 });

3132 task.factory.startnew(() =>

33

41 }

4243 });

4445

46 console.readkey();

4748 }

由於沒有加鎖或是其他機制,那麼很容易出錯,於是改進了版本。

1

static

void main(string args)

2

1516 });

1718 ;

19 task.factory.startnew(() =>

20

2930 }

3132 });

3334 task.factory.startnew(() =>

35

43 }

4445 });

執行這段**,可以工作,但是有點不太優雅,能不能不要去判斷集合是否為空?集合當自己沒有元素的時候自己block一下可以嗎?答案當然是可以的,使用blockingcollection即可:

1

static

void main(string args)

2

1314 });

1516

17 var consumer1 = task.factory.startnew(() =>

18

2425 });

2627 var consumer2 = task.factory.startnew(() =>

28

35else

36

39 }

40 });

41 task.waitany(product, consumer2, consumer1);

42 console.readkey();

43 }

當我需要控制queue停止反覆遍歷獲取queue是否存在元素時,可以使用如下方法,同時在構造方法中可以指定佇列的大小

1 blockingcollection.completeadding();

element ui dialog使用過程中的坑

場景一 我們將dialog寫成乙個可復用的公共元件用於顯示不同內容 如 操作中的修改或新增的彈窗 之後發現dialog的遮罩將彈出層 點選修改或新增後理應由乙個彈窗顯示出來 都蓋住了,而我想要的效果是遮罩只遮住舊的視窗,而當前視窗應該完全顯示 注 是使用easyui的panel和window來包裹的...

python使用過程中問題

1.檢視python支援的 whl格式 在cmd輸入python 或者 python3.6 import pip print pip.pep425tags.get supported 2.在修改python.exe為python36.exe 任何重新命名 後,pip會報錯 fatal error i...

Spring data Jpa使用過程中遇到的坑

一定要注意如果我們在實體類中沒有配置資料表的預設值,那麼在存入和取出的時候應該設定。否則在取出的時候就會出現問題。如何通過一方獲取到多方實體 jsp中 jsp資料夾與上面servlet對映名最好不要一致,這樣會出問題 注意!乙個實體類的表id名字請設定為id,保證不出錯。問題分析 解決方法 其實一般...