2012-05-23 52 views
0

我有下面的代码运行以启动我的表计算(表计算引发了几个查询返回数千行)。当我的应用程序运行一个实例时,事情很好,但是2个或更多,然后服务器变慢,我开始出错。在C中的多线程进程#

我应该把这段代码变成线程吗?这是如何完成的?

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(); 
      } 
     } 
+2

首先:如果您看到错误,请告诉我们您看到的错误。第二:你读的数据量是多少(即你可以将所有数据加载到RAM中)? – Kiril

+3

对于快速,简单和高效的多线程,您可以使用BackgroundWorker类http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx,但我的猜测是,您可能会遇到一些问题用你查询数据库的方式,或者你需要一些SQL调优。 –

+1

当你说“一个实例/两个实例”时,你的意思是进程或线程? – eyossi

回答

1

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

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

第三:如果无法一次加载所有数据,请尝试使用SqlDataReader从数据库中连续读取数据。

关于多线程:它真的取决于你的瓶颈在哪里。如果你的瓶颈是从数据库中读取数据,那么通过多线程处理你不会获得太多的收益(特别是如果你的数据库不允许并发访问)。您可以使用线程处理数据,一旦从数据库中获取数据,并且在您按照记录读取记录时必须使用SqlDataReader时效果尤佳。

+0

错误已完全列在另一张票中,如上面的注释中所示 – cdub

+0

确定,所以有人已经在这里回答你的问题:http://stackoverflow.com/questions/10712055/sql-server-and-net-memory-constraints-allocations-and-garbage-collection你发布多少次?有另一种方法,获取'SqlDataReader',并保持它打开...解决这个问题,让我们知道如果它变得更好。 – Kiril

+0

我有SqlDataReader阅读器,它的工作原理,但我做reader.Close()后ALL他们仍然ge那个错误。它与多进程的东西,而不是处理内存 – cdub