public void UpdateLeads()
{
int resultHome = 0;
int resultAuto = 0;
int resultCustomerSource = 0;
int resultShortName = 0;
int resultProducerLastName = 0;
int resultSource = 0;
int resultSourceOnAgencyId = 0;––
int resultSourceonAgencyIdRefNbr = 0;
int resultCustomer = 0;
Dictionary dictHomeAgenaNumber = new Dictionary();
DataTable dtHomeAgenaNumber = prepareDataDE.GetLeadIds();
foreach (DataRow dr in dtHomeAgenaNumber.Rows)
{
string LeadId = dr["LeadId"].ToString();
dictHomeAgenaNumber.Add(LeadId, dr);
}
DataTable dt = prepareDataDE.GetLeadsForProcessing();
if (dt != null && dt.Rows.Count > 0)
{
//Parallel.ForEach(dt.AsEnumerable(),dr =>
foreach (DataRow dr in dt.Rows)
{
string LeadId = dr["LeadId"].ToString();
if (dictHomeAgenaNumber.TryGetValue(LeadId, out var drHomeAgenaNumber))
{
int HomeAgenaNumber = Convert.ToInt32(drHomeAgenaNumber["HomeAgenaNumber"].ToString());
if (HomeAgenaNumber > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.agenaNumber, 2, -1);
continue;
//return;
}
else
{
resultHome = UpdateHomeLeads(LeadId);
if (resultHome > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgHomeLeads, 3, -1);
UpdateCustomerProspectInfo(LeadId);
UpdateOccp(LeadId);
SetSelfEmployed(LeadId);
UpdatePhonesAndEDD(LeadId);
UpdateFormattedPhone(LeadId);
SplitPhones(LeadId);
resultCustomerSource = UpdateCustomerSource(LeadId);
}
else if (resultHome == 0)
{
resultAuto = prepareDataDE.UpdateAutoLeads(LeadId);
if (resultAuto > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgAutoLeads, 4, -1);
UpdateCustomerProspectInfo(LeadId);
UpdateOccp(LeadId);
SetSelfEmployed(LeadId);
UpdatePhonesAndEDD(LeadId);
UpdateFormattedPhone(LeadId);
SplitPhones(LeadId);
resultCustomerSource = UpdateCustomerSource(LeadId);
}
else if (resultAuto == 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgAutoHome, 2, -1);
//return;
continue;
}
else
{
//return;
continue;
}
}
else
{
//return;
continue;
}
if (resultCustomerSource > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgCustomerSource, 5, -1);
resultShortName = UpdateShortName(LeadId);
if (resultShortName > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgCustShortName, 6, -1);
resultProducerLastName = UpdateProducerLastName(LeadId);
if (resultProducerLastName >= 0)
{
if (resultProducerLastName > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgProducerLastName, 7, -1);
}
UpdateATESSource(LeadId);
UpdateATESSourceAuto(LeadId);
resultSource = UpdateSource(LeadId);
if (resultSource > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgSource, 8, -1);
resultSourceOnAgencyId = UpdateSourceOnAgencyId(LeadId);
if (resultSourceOnAgencyId > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgSourceOnAgencyId, 9, -1);
resultSourceonAgencyIdRefNbr = UpdateSourceonAgencyIdRefNbr(LeadId);
if (resultSourceonAgencyIdRefNbr > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgSourceOnReferenceNbr, 10, -1);
resultCustomer = MatchExistingCustomers(LeadId);
if (resultCustomer > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.matchCustomers, 13, -1);
ProfileAnswerResponse response = UpdateProfileAnswer(LeadId);
if (response != null && response.status == "Success")
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.profileAnswer, 14, -1);
DependentResponse depResponse = AddDependent(LeadId);
if (depResponse != null && depResponse.Status == "Success")
{
prepareDataDE.UpdateMessageForLeads(LeadId, depResponse.depId.ToString() + "" + Constant.dependentInsert, 15, -1);
int resultAMSExported = UpdateAMSExported(LeadId);
if (resultAMSExported > 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.amsexported, 16, 1);
continue;
}
else
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.amsexportedFailed, 16, -1);
//return;
continue;
}
}
else
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.dependentNotInsert, 15, -1);
//return;
continue;
}
}
else
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.profileAnswerNotUpdated, 14, -1);
//return;
continue;
}
}
else
{
if (resultCustomer < 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.matchCustomersNotUpdated, 13, -1);
}
//return;
continue;
}
}
else if (resultSourceonAgencyIdRefNbr == 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgSourceOnReferenceNbrNotUpdated, 10, -1);
}
else
{
//return;
continue;
}
}
else if (resultSourceOnAgencyId == 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgSourceOnAgencyIdNotUpdated, 9, -1);
}
else
{
//return;
continue;
}
}
else if (resultSource == 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgSourceNot, 8, -1);
}
else
{
//return;
continue;
}
}
else
{
//return;
continue;
}
}
else if (resultShortName == 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgCustShortNameNotUpdated, 6, -1);
}
else
{
//return;
continue;
}
}
else if (resultCustomerSource == 0)
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.msgCustSourceNotUpdated, 5, -1);
}
else
{
//return;
continue;
}
}
}
else
{
prepareDataDE.UpdateMessageForLeads(LeadId, Constant.leadIdNotFound, 2, -1);
}
}
//});
}
else
{
Console.WriteLine("No leads remaining to Process...");
}
}
How to rewrite this block of code using multithreading. the reason is first I am getting leads from table using GetLeads and second i am taking Leads for Processing using GetLeadsForProcessing. Then I am using foreach loop on the datatable in which I am getting leads for processing and processing the leads. There are db calls in this loop. Here if there are suppose 5000 records process becomes slow,used parallel.foreach for multithreading but it gives deadlock error,kindly let me know how to use multithreading on this code to run code faster.

Aniket NarvankarPosted Nov 25, 2021, 12:37 PM
Srinivasan RamamoorthiPosted Nov 23, 2021, 7:28 PM
Aniket NarvankarPosted Nov 23, 2021, 4:11 PM
Srinivasan RamamoorthiPosted Nov 22, 2021, 2:32 PM
Check this link as how deadlock can be prevented.
https://www.c-sharpcorner.com/UploadFile/ff2f08/prevent-dead-lock-in-entity-framework/
Instead of implementing multi-threading try to execute batch of records every time to avoid deadlock. You can define batch size in configuration file and process the records in batch.
Multi threading would be efficient if same resources are not accessed. In your code I see lot of update DB calls which is causing the deadlock.