【问题标题】:Threading doesnot impact the performance while reading dataset records线程在读取数据集记录时不会影响性能
【发布时间】:2011-11-06 06:17:36
【问题描述】:

我有 5000 条记录的数据集。 我正在以下 2 个函数中阅读它们并写入 excel。

FillDataRows1(worksheet)
FillDataRows2(worksheet) 

private sub FillDataRow1(byval ws as worksheet)

   Dim rowpointer As Integer = 0
   While rowpointer <= dsCostUsage.Tables(0).Rows.Count - 1
      While colpointer <= dsCostUsage.Tables(0).Columns.Count - 1
         str = dsCostUsage.Tables(0).Rows(rowpointer)(colpointer).ToString()
         DirectCast(ws.Cells(row, column), Range).Value2 = item     
      colpointer += 1
      End While
   End While
End sub

private sub FillDataRow2(byval ws as worksheet)

   Dim rowpointer As Integer = 1001
   While rowpointer <= dsCostUsage.Tables(0).Rows.Count - 1
      While colpointer <= dsCostUsage.Tables(0).Columns.Count - 1
         str = dsCostUsage.Tables(0).Rows(rowpointer)(colpointer).ToString()
         DirectCast(ws.Cells(row, column), Range).Value2 = item      
   colpointer += 1
      End While
   End While
 End sub

我在第一个函数中读取 1000 条记录,并在第二个函数中保留。

问题是完成此过程至少需要 4 分钟。

所以,我决定使用 THREADING 作为

        Dim t As New Thread(AddressOf FillDataRows1)
        Dim t1 As New Thread(AddressOf FillDataRows2)

        t.Start(worksheet)
        t1.Start(worksheet)

        t.Join()
        t1.Join()

当我创建线程时,它也需要同样的时间。

我在创建线程时做错了什么吗? 有没有其他方法可以提高性能。

【问题讨论】:

  • 请注意你的格式 - 如果你的“工作表”很慢并且不能并行执行(我想就是这样),那么你会慢一点
  • 线程并不总是让事情变得更快 - 通常只是为了让您在完成任务时还可以做其他事情......
  • @Tim : 有没有办法让它快点,我想在一分钟内填完excel。
  • 什么是“excelLib”?它是否有任何选项可以在一个块中传输项目而不是单独传输?也许还可以考虑创建一些局部变量来缓存查找,例如 dsCostUsage.Tables(0).Columns.Count 而不是一遍又一遍地获取值。
  • @Tim 更改了 excelLib 行

标签: vb.net excel vba


【解决方案1】:

每次调用 Excel 函数时,它必须离开应用程序的线程,进入 Excel 的线程,执行函数,保存结果,返回应用程序的线程,然后检索结果。这很慢。对 Excel 的每个单独调用都很慢。和一行如:

Worksheets(1).Range("A1").Value += 1

是对 Excel 的四个单独调用,一个用于Worksheets,一个用于Range,两个用于Value

在您的应用程序中做尽可能多的工作。使用Range.Value 属性在大范围内从 Excel 读取和写入数据数组。

编辑:我完全忘了解决实际问题。

线程没有帮助,因为访问 Excel 存在巨大的瓶颈。我猜 Excel API 只能在单个线程上使用。因此,在多个线程访问 Excel 的情况下,每个线程必须等待另一个线程完成才能与 Excel 对话。

如果您从 Excel 中提取一个数据块,然后让多个线程处理这些数据并在您的应用程序中创建一个新的数据表,您将会看到改进。

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多