C# 一个具有数据集的类库,该数据集进行更新…将其转换为多线程应用程序
我有下面的代码,可以更新 例如,如果我有200条记录,因为它是单线程的,所以需要4个小时。 现在,为了提高性能/减少执行时间,我需要将其设置为多线程(任何线程都不应在5到10之间进行配置) 感谢您的回复C# 一个具有数据集的类库,该数据集进行更新…将其转换为多线程应用程序,c#,multithreading,c#-4.0,datatable,C#,Multithreading,C# 4.0,Datatable,我有下面的代码,可以更新 例如,如果我有200条记录,因为它是单线程的,所以需要4个小时。 现在,为了提高性能/减少执行时间,我需要将其设置为多线程(任何线程都不应在5到10之间进行配置) 感谢您的回复 public class EnableFeature { public const string strPendingStatus = "P"; [STAThread] static void Main(string[] args)
public class EnableFeature
{
public const string strPendingStatus = "P";
[STAThread]
static void Main(string[] args)
{
EnableFeature obj = new EnableFeature();
obj.ProcessRequests();
}
public void ProcessRequests()
{
DataSet objDs = new DataSet();
//Get all the matching Records that has Pending Status from Database
objDs = EnableFeatureDAO.SelectByStatus(strPendingStatus);
if (objDs != null && objDs.Tables.Count > 0 && objDs.Tables[0].Rows.Count > 0)
{
//This needs to Multi Threaded
foreach (DataRow objDr in objDs.Tables[0].Rows)
{
//Business Object/ Business Layer Call
EnableFeatureBO objEnableFeatureBO = new EnableFeatureBO();
try
{
//Do updates by calling webservice internally here which has Stored Proc
//It has it's connection details to take care of Updates
//Backend is Oracle
// Order in which these are going doesn't matter as they open up a separate connection for each thread
objEnableFeatureBO.EnableDisableFeatureExecuteScripts(
objDr[EnableFeatureDAO.COL_CUSTID],
objDr[EnableFeatureDAO.COL_ISICLIENTID],
objDr[EnableFeatureDAO.COL_CLIENTDBSCHEMA],
objDr[EnableFeatureDAO.COL_CLIENTDBSERVER]);
}
catch (Exception ex)
{
//log Exception
}
}
}
}
}
谢谢
Rita假设您的业务逻辑都是线程安全的,您可以使用并行for循环来迭代行(也假设业务逻辑不会添加或更改行)
public void ProcessRequests(int maxThreads = 5)
{
DataSet objDs = new DataSet();
objDs = EnableFeatureDAO.SelectByStatus(strPendingStatus);
if (objDs != null && objDs.Tables.Count > 0 && objDs.Tables[0].Rows.Count > 0)
{
ParallelOptions options = new ParallelOptions() { MaxDegreeOfParallelism = maxThreads };
Parallel.For(0, objDs.Tables[0].Rows.Count, options, (i) =>
{
DataRow objDr = objDs.Tables[0].Rows[i];
//Business Object/ Business Layer Call
EnableFeatureBO objEnableFeatureBO = new EnableFeatureBO();
try
{
//Do updates by calling webservice internally here which has Stored Proc
//It has it's connection details to take care of Updates
//Backend is Oracle
// Order in which these are going doesn't matter as they open up a separate connection for each thread
objEnableFeatureBO.EnableDisableFeatureExecuteScripts(
objDr[EnableFeatureDAO.COL_CUSTID],
objDr[EnableFeatureDAO.COL_ISICLIENTID],
objDr[EnableFeatureDAO.COL_CLIENTDBSCHEMA],
objDr[EnableFeatureDAO.COL_CLIENTDBSERVER]);
}
catch (Exception ex)
{
//log Exception
}
});
}
}