如何在 C# 中使用线程同时执行存储过程 [已关闭]

How to execute stored procedure simultaneously using threads in C# [closed]

提问人:Md Thousif 提问时间:11/13/2023 最后编辑:Md Thousif 更新时间:11/16/2023 访问量:61

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

9天前关闭。

这篇文章在 6 天前被编辑并提交审核,未能重新打开帖子:

原始关闭原因未解决

使用线程在 3 个不同的表中同时插入数据

            public class ProcessThreads
           {        
                Dictionary<string, string> dic = new Dictionary<string, string>();
                //DataLibrary[] _dbs = new DataLibrary[10];
                #region Variable Decleration      
                IRIZID.DataLib.DataLibrary _db = new DataLibrary();
                #endregion
               public ProcessThreads()
               {
                 string cf = @"C:\Program Files (x86)\IRIZ ID\TNAS\Connections";  
                 string[] dsFiles = Directory.GetFiles(cf, "*.ds");
            
                 List<Thread> threads = new List<Thread>();

            foreach (string dsFile in dsFiles)
            {
                string fileName = Path.GetFileNameWithoutExtension(dsFile);
                string fileContent = File.ReadAllText(dsFile);
                dic.Add(fileName, fileContent);
            }
            

            foreach (string value in dic.Keys)
            {  
                Thread thread = new Thread(() => connection(value));
                thread.Name = value.Substring(0, 4);
                threads.Add(thread);
            }
            
                foreach (Thread thread in threads)
                {
                    thread.Start();                    
                }
                
        }
        

        void connection(string fileName)
        {
            ProcessPunch processPunch = new ProcessPunch(fileName);
            ProcessPunchFILO processPunchFilo = new ProcessPunchFILO(fileName);        
        }
}

public class ProcessPunch
       {
        #region Global Variables
        DataTable dataTable;
        DataLibrary dataLibrary;
        DateTime PDate = new DateTime();
        #endregion

        public ProcessPunch(string fileName)
        {
            
            try
            {
                bool connStatus = false;
                dataLibrary = new DataLibrary(fileName, false, out connStatus);
                //dataLibrary = new DataLibrary(true, fileName);
                string queryString = string.Empty;

                queryString = "EXEC usp_TNA_ProcessPunch";       
                dataLibrary.ExecuteNonQuery(queryString);
            }
            catch (ApplicationException ae)
            {
                WriteLogs.WriteErrorLogs(-1, 0, GetType().FullName + "." + MethodBase.GetCurrentMethod().Name, ae.ToString());
            }
            catch (Exception e)
            {
                WriteLogs.WriteErrorLogs(-1, 0, GetType().FullName + "." + MethodBase.GetCurrentMethod().Name, e.ToString());
            }
            finally
            {
                dataLibrary.FinalizeDataService();
            }
        }
       }

public class ProcessPunchFILO
    {
        #region Global Variables
        DataTable dataTable;
        DataTable dataTablePdate;
        DataTable dataTableTransaction;
        DataLibrary dataLibrary;
        DateTime PDate = new DateTime();
        #endregion

        public ProcessPunchFILO(string fileName)
        {
           // ProcessPunchFILOTransaction();

            try
            {
                bool connStatus = false;
                dataLibrary = new DataLibrary(fileName, false, out connStatus);
                //dataLibrary = new DataLibrary(true, fileName);
                string queryString = string.Empty;
                queryString = "EXEC usp_TNA_ProcessPunchFILO";
                dataLibrary.ExecuteNonQuery(queryString);
            }
            catch (ApplicationException ae)
            {
                WriteLogs.WriteErrorLogs(-1, 0, GetType().FullName + "." + MethodBase.GetCurrentMethod().Name, ae.ToString());
            }
            catch (Exception e)
            {
                WriteLogs.WriteErrorLogs(-1, 0, GetType().FullName + "." + MethodBase.GetCurrentMethod().Name, e.ToString());
            }
            finally
            {
                dataLibrary.FinalizeDataService();
            }
        }
}

我需要为 3 个不同的数据库并行执行存储过程,但使用线程过程正在执行,但同时数据没有插入

无论我发布什么代码,我都尝试过。启动线程 使用 For 循环,因为它取决于 Connection 文件夹中存在的文件数量,因此我创建和启动的线程数量相同

C# SQL-Server 多线程处理 visual-studio-2013

评论

2赞 Panagiotis Kanavos 11/13/2023
不需要线程即可同时执行多个存储过程。ADO.NET 具有所有执行方法的异步变体,例如 或 .您真正需要的是多个连接,因为每个连接一次只能执行一个命令DbCommand.ExecuteReaderAsyncExecuteNonQueryAsync
3赞 Panagiotis Kanavos 11/13/2023
另一方面,并发处理并不能保证更快的执行速度。如果你有一个错误的查询或脚本,例如强制全表扫描或导致过度阻塞,多次运行它将使事情变得更糟,甚至成倍地恶化,因为错误的脚本将开始相互阻塞
1赞 Zohar Peled 11/13/2023
另外,如果将数据插入到三个不同的表中,为什么要同时插入数据?这里有什么好处?
2赞 Ralf 11/13/2023
“但同时数据没有插入”,作为错误描述很薄。调试代码,查看发生了什么。如果您看到异常/错误告诉他们,那么除了说“以不同的方式做”之外,我们可能还有其他想法。
1赞 Ralf 11/13/2023
您只是两次显示相同的代码,还是我错过了这里的重点?

答: 暂无答案