지난 4 년 동안 C# 코드를 사용해 보았지만 최근에는 결코 통과하지 못하는 시나리오를 겪었습니다. "Index out of range error"문제를 해결하기위한 프로젝트가 있습니다. 코드가 미친 듯이 보이고 모든 불필요한 것들이 있었지만 지난 3 년 동안 생산 중이었기 때문에이 문제를 해결해야합니다. 문제가 발생했습니다. Parallel.Foreach에서 동기화 잠금 문제가 발생했습니다.
class FilterCondition
{
.....
public string DataSetName {get; set;}
public bool IsFilterMatch()
{
//somecode here
Dataset dsDataSet = FilterDataSources.GetDataSource(DataSetName); // Static class and Static collection
var filter = "columnname filtername"
//some code here
ds.defaultview.filter= filter;
var isvalid = ds.defaultView.rowcount > 0? true : false;
return isValid;
}
}
// from a out side function they put this in a parallel loop
Parallel.ForEach()
{
// at some point its calling
item.IsFiltermatch();
}
내가 디버깅
,dsDataSet
나는
dsDataSet
내 여러 스레드를 수정 한 것을 보았다. 그래서 경쟁 조건이 발생하고 필터를 적용하지 못하고 범위를 벗어난 인덱스로 실패합니다.
내 질문은 여기 내 질문은, 내 방법은 비 정적 및 스레드 안전, 다음이 경쟁 조건이 발생하는 방법 dsDataset
내 멤버 함수 내에서 로컬 변수입니다. 이상하게도, 나는 Parallel과 관련이 있다고 생각합니다 .Foreach.
정상적인 잠금 장치를 놓았을 때 문제가 해결되었으므로 응답이 없습니다. 왜 비 정적 멤버 함수에 락을 두어야합니까?
누구든지 내게이 문제에 대한 답변을 줄 수 있습니까? 나는이 그룹에 처음 온 사람이다. 질문에 빠진 것이 있으면 알려주세요. 클라이언트 제한이 있기 때문에 전체 코드를 복사 할 수 없습니다. 읽어 주셔서 감사합니다.
이 호출에 문제가 있습니다. FilterDataSources.GetDataSource (DataSetName); 당신은 공유되는 자원에 글을 쓰고 있습니다. 그리고 잠금을 구현해야합니다. – Ehsan