2012-05-29 2 views
0

이 질문의 대답에 제공된대로 Windows 콘솔 응용 프로그램에서 threadsafe 데이터 세트 업데이트 작업을 구현했습니다.RefreshType 매개 변수가있는 메소드를 사용하여 threadsafe 전역 데이터 세트를 업데이트하십시오.

Threadsafe Dataset

은 내가 데이터 집합 행을 업데이트하기 위해 다음과 같은있어 접근 방식을 다시 한 번 확인하고 싶다.

각 스레드에는 UpdateData 인스턴스 메서드가 있습니다. 이 메소드는 기본 키의 문자열 배열을 작성하여 datatable에 특정 행을 찾고 해당 행에서 업데이트 할 데이터 사전을 작성합니다.

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 메서드를 호출하면 스레드는 두 개의 서로 다른 스택이 생성되고 각 스택은 전달 된 매개 변수에 대한 참조를 보유하게됩니다. 따라서 실행중인 각 컨텍스트에서 모든 매개 변수가 일관성이 보장됩니다.

따라서 하나의 키와 다른 스택의 데이터로 업데이트 할 수 없습니다.

관련 문제