如何跨多个线程使用相同的类并返回变量

时间:2014-02-25 01:54:52

标签: vb.net multithreading loops .net-3.5

如果已经回答了这个问题我提前道歉,但我所做的每一次搜索都没有接近我的需要。此外,这都是伪代码。

以下是这种情况:我创建了一个表单(目标为DOT NET 3.5),它在gridview上重新创建一个类并运行代码。代码运行后,类上有一个更新的局部变量,允许我使用它并重复该过程。像这样:

For x as Integer = 0 to Me.txtTextBox.Lines.Count - 1 'Can be in the hundreds
Dim objMyClass as MyClass = New MyClass(Me.DatagridView1.Rows(x).Cells(0).Value)
if objMyClass.Start() = True then
'Do my thing with objMyClass.LocalLongVariable
End If
Next

这很好用,但需要几天才能完成。我最后一次运行它需要花费6天,7小时40分钟才能完成,几乎没有达到CPU使用率。

所以,现在我想使用MulitThreading同时运行其中几个实例。我无法让这个工作。我尝试的所有东西每次运行时都会返回不同的值(它不应该)。我相信线程正在跨越其他线程访问本地变量并且随意递增。 SyncLock锁定整个程序。我还尝试添加一个自定义事件,该事件在进程完成时触发并在Main表单上执行委托,但这也没有用。

现在,我的问题很简单:如何使用相同的基类运行多个线程(传递唯一的字符串变量)并让本地类变量将正确的结果返回给UI? (并且,根据我一直在阅读的内容,BackgroundWorker类不适合这么多线程(如数百个);如果我读错了请纠正我)

我正在寻找类似的东西:

Dim thrd(Me.txtTextBox.Lines.Count) as Thread
Dim objMyClass(Me.txtTextBox.Lines.Count) as MyClass
For x as Integer = 0 to Me.txtTextBox.Lines.Count - 1
thrd(x) = new Thread (Sub() 
                       objMyClass(x) = New MyClass(Me.GridView1.Rows(x).Cells(0).Value
                       If objMyClass.Start() = True Then
                       'Do my stuff here (maybe call a delegate??)
                       End If
                       End)
thrd(x).IsBackground = True
thrd(x).Start()
Next

任何有关如何进行的帮助/建议将不胜感激。并且,如果您知道任何建议的示例,请发布代码/链接。

1 个答案:

答案 0 :(得分:0)

事实上,解决方案是Synclock。我的问题是我锁定了错误的对象objMyClass,而不是当前的我和我没有使用Monitor.PulseAll()。此外,我切换到使用ThreadPool.QueueUserWorkItem(AddressOf objMyClass,args),并在线程完成时引发的自定义事件上使用了SyncLock。它更容易!谢谢!