業務需求: 傳送特定的請求,根據返回的資訊執行特定的事件。執行這段**,可以工作,但是有點不太優雅,能不能不要去判斷集合是否為空?集合當自己沒有元素的時候自己block一下可以嗎?答案當然是可以的,使用blockingcollection即可:目前的做法:把我的請求放入乙個容器內,然後待到某一條件,就從這個容器把請求傳送出去,等客戶返回資訊時,查詢容器中對應請求中特定的事件。開始的時候我使用 list .其中遇到一些問題,紀錄一下
1 namespace collsecexp2 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 collsecexp2 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如下
1static
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 }
由於沒有加鎖或是其他機制,那麼很容易出錯,於是改進了版本。
1static
void main(string args)
2
1516 });
1718 ;
19 task.factory.startnew(() =>
20
2930 }
3132 });
3334 task.factory.startnew(() =>
35
43 }
4445 });
1static
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,保證不出錯。問題分析 解決方法 其實一般...