我正在編寫一個應用程序,顯示用戶可以選擇的對象列表,然後通過PropertyGrid控件查看和編輯屬性。通過使用輔助線程從文件中提取信息的耗時過程填充了對象的屬性。但是我還想讓用戶在提取過程正在進行時繼續查看其他對象。如何控制多個線程對一組對象的訪問?
在閱讀了關於SO的my previous問題的回答之後。這聽起來像是因爲提取過程寫入的屬性不能與用戶通過屬性網格編輯的屬性相交,所以我不應該在兩個線程同時編輯對象時遇到問題。儘管如果用戶看起來非常不幸並且屬性網格最終在非原子寫入過程中讀取對象,那麼用戶可能會看到不正確的值。
但是,我仍然想知道如何設置它來防止用戶編輯或查看正在提取中的對象。我對多線程非常陌生,但我已閱讀的大多數示例都顯示了一個單獨的令牌對象,該對象被創建爲用於鎖定對實際感興趣對象的訪問。我的另一個previous question的答案證實,通常創建一個像這樣的獨立對象專門用於鎖定。
所以,現在我想知道的是,在我的情況下,如何處理這些對象的大量集合?我想創建鎖,防止屬性網格顯示用戶選擇的對象,如果它正在被提取到。
我是否需要創建一個單獨的鎖對象集合,與我的真實集合保持同步?所以如果一個對象被添加或從我的主集合中刪除,我必須從我的鎖集合中添加或刪除鎖對象?
我是否鎖定實際對象而不是創建單獨的令牌鎖對象?
將「IsBeingExtracted」布爾屬性添加到屬性網格可以檢查以查看該對象是否正在寫入中間的對象呢?這將在提取過程的開始和結束時被設置。
或者如何引用當前正在提取的當前(如果有的話)對象的靜態字段。然後,屬性網格可以檢查請求顯示的最新對象是否不是由此靜態字段引用的對象?如果有多個提取線程,這當然不起作用。
什麼是最好的/正確的方法來做到這一點?就我個人而言,我最喜歡布爾屬性選項,但想知道其他人真正知道自己在做什麼的想法。
爲什麼鎖必須保持一秒鐘或更長時間?同步線程的一部分是儘量減少爭用時間。 – 2010-02-27 02:16:09
@Rory - 這是等待編輯項目的時間量,而不是持有鎖的時間量。 – ChaosPandion 2010-02-27 02:19:54