Vb.net BackgroundWorker在创建时花费大量时间

Vb.net BackgroundWorker在创建时花费大量时间,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,我有一个控制工厂生产线的软件。沿线有一些条形码阅读器。当软件收到条形码时,它必须调用进度数据库中的过程。有时,通话需要1-2秒,因此它被封闭在后台工作人员中 出于未知原因,在运行几个小时后,动态创建BGW需要花费大量时间。可能在5秒到9分钟之间 以下是创建BGW的代码: Dim oParams() As Object = {aParam, opCode, Barcode} Dim bckInsert As New System.ComponentModel.BackgroundWorker A

我有一个控制工厂生产线的软件。沿线有一些条形码阅读器。当软件收到条形码时,它必须调用进度数据库中的过程。有时,通话需要1-2秒,因此它被封闭在后台工作人员中

出于未知原因,在运行几个小时后,动态创建BGW需要花费大量时间。可能在5秒到9分钟之间

以下是创建BGW的代码:

Dim oParams() As Object = {aParam, opCode, Barcode}
Dim bckInsert As New System.ComponentModel.BackgroundWorker

AddHandler bckInsert.DoWork, AddressOf bckInsert_DoWork
MyBase.Add("Création background pour " & Barcode)
bckInsert.RunWorkerAsync(oParams)
MyBase.Add
调用函数将信息记录到ASCII文件中

以下是
DoWork
处理程序的代码:

Private Sub bckInsert_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
    Dim oParams() As Object = e.Argument

    Try
        Dim aParam = CType(oParams(0), Progress.Open4GL.Proxy.ParamArray)
        Dim opCode As String = oParams(1).ToString
        Dim Barcode As String = oParams(2).ToString

        MyBase.Add("Début DoWork: " & Barcode & " Op: " & opCode)
通常,日志行在文件中应该是连续的

下面是日志文件的一个示例:

11:00:04:243 - Création background pour 1580570 001000 11:00:04:243 - Début DoWork: 1580570 001000 Op: 130 11:00:04:243-铬化背景浇注1580570 001000 11:00:04:243-但嫁妆:1580570 001000作品:130 同时

现在,当创建需要很长时间时:

11:00:37:049 - Création background pour 1580578 001000 11:00:42:977 - Début DoWork: 1580578 001000 Op: 130 11:00:37:049-铬化背景浇注1580578 001000 11:00:42:977-Début DoWork:1580578001000 Op:130 5秒延迟

11:01:30:121 - Création background pour L5315273 001000 11:10:47:884 - Début DoWork: L5315273 001000 Op: 240 11:01:30:121-Création背景浇注L5315273 001000 11:10:47:884-Début DoWork:L5315273001000 Op:240 9分钟

CPU在1%到9%之间,仍然有大量可用RAM


有人知道这是怎么发生的吗?

您是否将工作人员存储在任何地方,您是否
Dispose
他们?是否
MyBase。添加为非阻塞多线程访问而设计的
?否,没有Dispose。Worker是从一个局部变量创建的,我猜它的资源在DoWork过程完成后会由垃圾收集器处理。我非常怀疑它是否有用,但是与其使用
Dim oParams()作为Object={aParam,opCode,Barcode}
不如使用一个类(比如,“bgwParameters”)使用与该数组和BGW中的项相对应的属性,您可以
Dim oParams()作为bgwParameters=DirectCast(e.Argument,bgwParameters)
。除了@AndrewMorton的注释之外,在这种情况下,您不应该在变量名后加括号,因为这样会使变量成为数组(而
e.Argument
不是). -- 回答你的评论:不,让它成为一门课不会加快任何速度。在本例中,它的目的只是为了提高可读性并简化您的工作。您是否将工作人员存储在任何位置,以及您是否
Dispose
他们?是
MyBase。添加
设计用于非阻塞多线程访问?否,没有Dispose。Worker是从一个局部变量创建的,我猜它的资源在DoWork过程完成后会由垃圾收集器处理。我非常怀疑它是否有用,但是与其使用
Dim oParams()作为Object={aParam,opCode,Barcode}
不如使用一个类(比如,“bgwParameters”)使用与该数组和BGW中的项相对应的属性,您可以
Dim oParams()作为bgwParameters=DirectCast(e.Argument,bgwParameters)
。除了@AndrewMorton的注释之外,在这种情况下,您不应该在变量名后加括号,因为这样会使变量成为数组(而
e.Argument
不是). -- 回答你的评论:不,让它成为一门课不会加快任何速度。在这种情况下,它的目的只是为了提高可读性和简化您的工作。