C# 一个具有数据集的类库,该数据集进行更新…将其转换为多线程应用程序

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)

我有下面的代码,可以更新

例如,如果我有200条记录,因为它是单线程的,所以需要4个小时。 现在,为了提高性能/减少执行时间,我需要将其设置为多线程(任何线程都不应在5到10之间进行配置)

感谢您的回复

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
                }
            });

        }
    }