[問題] 使用ConcurrentDictionary

看板C_Sharp (C#)作者 (neo)時間10年前 (2015/01/17 16:12), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串1/1
各位好 小弟想建立一個2D的 ConcurrentDictionary 來儲存現在螢幕的畫面 並且我用Parallel.For 來給value Code如下所示 public ConcurrentDictionary<int, ConcurrentDictionary<int,Color>> pub_screen_all_dic = new ConcurrentDictionary<int, ConcurrentDictionary<int,Color>>();//記錄所有像素 #region 建立一個1920x1080的2D ConcurrentDictionary for(int x=0;x<exact_from_rect.Width;x++) { for (int y = 0; y < exact_from_rect.Height; y++) { if (!pub_screen_all_dic.ContainsKey(x)) { ConcurrentDictionary<int, Color> A = new ConcurrentDictionary<int, Color>(); pub_screen_all_dic.TryAdd(x, A); } if (!pub_screen_all_dic[x].ContainsKey(y)) { Color B = new Color(); pub_screen_all_dic[x].TryAdd(y, B); } pub_screen_all_dic[x].TryAdd(y, Color.Blue); } } #endregion Point upperLeftSouce = new Point(0, 0); Bitmap bmp = new Bitmap(1920, 1080); using (Graphics g = Graphics.FromImage(bmp)) { g.CopyFromScreen(upperLeftSouce, new Point(0, 0), bmp.Size); } Parallel.For(0, blockRegionSize.Width, x => { Parallel.For(0, blockRegionSize.Height, y => { pub_screen_all_dic[x].TryAdd(y, bmp.GetPixel(x, y)); }); }); pub_screen_all_dic[x].TryAdd(y, bmp.GetPixel(x, y)); 會出現問題 其他地方正在使用物件。 請問我要怎麼寫才可以達到用multithread 來儲存我螢幕畫面呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.71.212.90 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1421482359.A.225.html

01/17 23:20, , 1F
之前用的經驗,ConcurrentDictionary並不是真的thread safe
01/17 23:20, 1F

01/17 23:21, , 2F
所以還是自己寫lock吧
01/17 23:21, 2F

01/18 04:56, , 3F
01/18 04:56, 3F

01/18 04:56, , 4F
這邊有 ConcurrentDictionary 的 source code
01/18 04:56, 4F

01/18 21:40, , 5F
我後來發現到是bmp.GetPixel 的關係 無法同時存取
01/18 21:40, 5F
文章代碼(AID): #1KkXbt8b (C_Sharp)
文章代碼(AID): #1KkXbt8b (C_Sharp)