I am completely new to threading. I have such a method in which I am trying to implement parallel executions in thread safe manner(at least I hope so):
private void PerformSearch(List<FailedSearchReportModel> failedSearchReports)
{
foreach (var item in failedSearchReports)
{
item.SearchTerms = item.SearchTerms.Take(50).ToList();
var siteId = ConstantsEnumerators.Constants.Projects.GetProjectIdByName(item.Site);
if (SearchWrapperHelper.IsSeas(siteId))
{
item.UsedEngine = "Seas";
var model = GetBaseQueryModel(item.Site);
Parallel.ForEach(item.SearchTerms,
new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) },
(term) =>
{
lock (seasSyncRoot)
{
CheckSearchTermInSeas(model, term, item.Site, item.Language);
}
});
}
else
{
item.UsedEngine = "Fast";
Parallel.ForEach(item.SearchTerms, term =>
{
lock (fastSyncRoot)
{
CheckSearchTermInFast(term, item.Site, item.Language);
}
});
}
}
}
Even though in guidelines it is mentioned for lock statement only to wrap as little amount of code as possible, here is how nested CheckSearchTerm method looks like:
private void CheckSearchTermInSeas(SearchQueryModel baseModel, FailedSearchTermModel term, string site, string language)
{
var projectId = ConstantsEnumerators.Constants.Projects.GetProjectIdByName(site);
term.SearchTerm = ClearSearchTerm(term.SearchTerm).Replace("\"", string.Empty);
var results = SearchInSeas(baseModel, term.SearchTerm, projectId, language);
term.DidYouMean = GetDidYouMean(results?.Query.Suggestion, term.SearchTerm);
term.HasResult = results?.NumberOfResults > 0;
if (!term.HasResult && string.IsNullOrEmpty(term.DidYouMean))
{
results = SearchInSeas(baseModel, term.SearchTerm, projectId, InverseLanguage(language));
term.WrongLanguage = results?.NumberOfResults > 0;
if (!term.WrongLanguage)
{
term.DidYouMean = GetDidYouMean(results?.Query.Suggestion, term.SearchTerm);
}
}
if (!string.IsNullOrEmpty(term.DidYouMean))
{
results = SearchInSeas(baseModel, term.DidYouMean, projectId, term.WrongLanguage ? InverseLanguage(language) : language);
term.DidYouMeanHasResult = results?.NumberOfResults > 0;
if (!term.DidYouMeanHasResult)
{
results = SearchInSeas(baseModel, term.DidYouMean, projectId, term.WrongLanguage ? language : InverseLanguage(language));
term.DidYouMeanHasResult = results?.NumberOfResults > 0;
}
}
}
Am I doing everyting right, can you please provide some explanation? Or should I change it? PS: Now if i need to write all this records into the file(excel) should I also use Parallel to increase performance? And if so approach would be the same?