Я работал с кодом C# в течение последних 4 лет, но недавно я прошел через сценарий, который я никогда не проходил. У меня есть проклятый проект по устранению ошибки «Index out of range». Код выглядит сумасшедшим, и все ненужные вещи были там, но он был в производстве в течение последних 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