【问题标题】:Multi threading of process in C#C#中进程的多线程
【发布时间】:2012-05-23 18:49:34
【问题描述】:

我运行以下代码来启动我的表计算(表计算会触发一些返回数千行的查询)。当我的应用程序只运行一个实例时,一切都很好,但是 2 或更多然后服务器变慢并且我开始收到错误。

我应该把这段代码变成线程吗?这是怎么做到的?

private static object _lock = new object();

private void RunTable(string outputType, string _outputDataType) {

        Server.ScriptTimeout = 300;

        string returnCode = string.Empty;
        lock (_lock)
        {
            using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainDll"].ToString()))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(sql.ToString(), connection))
                {
                    command.CommandType = CommandType.Text;
                    command.CommandTimeout = 300;
                    returnCode = (string)command.ExecuteScalar();
                    Dispose();
                }
                Dispose();
            }
        }

【问题讨论】:

  • 首先:如果您看到错误,请告诉我们您看到了什么错误。第二:你正在读取多少数据(即你可以将所有数据加载到 RAM 中)?
  • 为了快速、简单、高效的多线程,你可以使用 BackgroundWorker 类 msdn.microsoft.com/en-us/library/… 但我猜你查询数据库的方式可能有问题,或者你可能需要一些SQL 调优。
  • 当您说“一个实例/两个实例”时,您是指进程还是线程?
  • Dispose() 自己在那里做什么?这肯定是不对的! using 的好处是,在这种情况下,您甚至不需要手动调用 command.Dispose/connection.Dispose(看看我在那里做了什么?)方法。省略它。

标签: c# asp.net .net multithreading sql-server-2005


【解决方案1】:

首先:如果您看到错误,请告诉我们您看到了什么错误。

第二:你正在读取多少数据(即你可以将所有数据加载到 RAM 中)?

第三:如果不能一次加载所有数据,那么尝试使用SqlDataReader连续读取数据库。

关于多线程:这真的取决于你的瓶颈在哪里。如果您的瓶颈在于从数据库读取,那么通过多线程处理您将不会获得太多收益(特别是如果您的数据库不允许并发访问)。从数据库中获取数据后,您可以使用线程来处理数据,并且当您必须使用SqlDataReader 时效果特别好,因为您正在逐条读取数据。

【讨论】:

  • 如上面的 cmets 所示,错误已完全列在另一张工单中
  • 好的,已经有人在这里回答了你的问题:stackoverflow.com/questions/10712055/… 你发了多少次了?您有另一种获取SqlDataReader 的方法,并且您将其保持打开状态...解决该问题并让我们知道它是否会变得更好。
  • 我有 SqlDataReader 阅读器,它可以工作,但我在所有这些阅读器之后执行 reader.Close() 并且仍然收到该错误。它具有多进程并且不释放内存
  • 尝试用一个非常简单的例子重现问题,并消除所有与问题无关的“外部”问题。如果另一个线程在关闭当前打开的线程之前尝试创建SqlDataReader,则多线程可能会出现问题。确保在使用多个线程和多个SqlDataReaders 时正确同步(即一次只能打开一个)。
猜你喜欢
  • 2013-06-11
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 2010-12-14
  • 2014-08-16
相关资源
最近更新 更多