2012-05-29 46 views
0

更新線程安全全局數據集使用方法我已經在Windows控制檯應用程序中實現了線程安全數據集更新操作,如此問題的答案中所給出的。使用引用類型參數

Threadsafe Dataset

我想仔細檢查我下面的更新數據集行的辦法。

每個線程都有UpdateData實例方法。此方法創建一個主鍵字符串數組,以查找數據表中的特定行以及該行中要更新的數據字典。

private void UpdateData() 
{ 

string[] key=new string(){"",""}; 
Dictionary<string,string> data=new Dictionary<string,string>(); 

key[0]="key1"; 
key[1]="key2"; 
data.Add("col1","value1"); 
data.Add("col2","value2"); 
MyDataSet.UpdateRecord(key,data); 
} 

現在有這種共享方法用於更新全局數據集中的DataTable行。

public sealed class MyDataSet 
{ 

public static DataSet ds= new DataSet(); 

private static object _lock =new object(); 

public static UpdateRow(string[] key,Dictionary<string,string> data) 
{ 
    lock(_lock){ 

    DataRow dr=ds.Tables[0].Rows.Find(key); 
    dr.AcceptChanges(); 
    dr.BeginEdit(); 
    foreach(KeyValuePair<string,string> field in data) 
    { 
     dr[field.key]=field.value; 
    } 

    dr.EndEdit(); 
    } 
} 
} 

所以我的問題是,如果傳遞的密鑰和數據是引用類型的靜態共享方法,這種方法強加任何問題線程安全?密鑰和數據都不共享,每個線程都創建自己的副本。如果兩個線程進入UpdateRow方法,是否有可能通過任何方式使用一個線程傳遞的密鑰更新行和另一個線程的數據(我知道這個問題聽起來很愚蠢)

回答

2

如果UpdateRow方法被兩個不同的方法調用線程將創建兩個不同的堆棧,每個堆棧將保存對傳入的參數的引用。因此,在每個執行上下文中,您都可以保證所有參數都一致。

因此,不可能用一個密鑰和另一個堆棧的數據進行更新。

相關問題