2012-01-12 74 views
0

我有一種方法解析屬於某個用戶的一些數據並將其保存到數據庫。如何在使用BeginInvoke進行多線程時鎖定資源?

delegate void parseUserDataDelegate(string pathToFile); 

我爲它創建了一個委託並使用BeginInvoke進行呈現以進行並行處理。

parseUserDataDelegate deleg = new parseUserData(this.parseUserData); 
IAsyncResult result = deleg.BeginInvoke(path, null, null); 
deleg.EndInvoke(result); 

問題是有兩個表 - 一個用於外鍵是用戶ID和另一個用戶表的數據。當解析時沒有相應的用戶時,該方法向用戶表中添加一個新條目並使用其ID。一個用戶的數據表中大約有100個條目。問題是,當處理第一個用戶的所有數據時,會出現錯誤,因爲兩個線程嘗試爲第二個用戶創建相同的條目。如何鎖定不同線程的用戶表訪問權限?

+0

如果您立即調用BeginInvoke並緊接着EndInvoke,則不會有並行處理。調用EndInvoke的線程將等待操作完成。 – 2012-01-12 15:01:52

+0

我建議你在做任何事務之前先檢查新用戶。插入它們,然後只在第二張桌子上工作......除非我錯過了一些你的邏輯 – Boomer 2012-01-12 15:03:38

回答

0

取決於你的代碼。我會建議尋找用戶的方法和可選地創建新用戶的地方放在鎖定塊中。

lock(NewUserSync) 
{ 
    FooBar(); 
} 

其中NewUserSync是這些工作線程之間共享的普通對象。如果解析代碼在類中,則它在ctor中創建(在多線程上啓動該方法之前)。用戶ID當然可以緩存在某個共享對象中(需要線程安全性)。