如果已经回答了这个问题我提前道歉,但我所做的每一次搜索都没有接近我的需要。此外,这都是伪代码。
以下是这种情况:我创建了一个表单(目标为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
任何有关如何进行的帮助/建议将不胜感激。并且,如果您知道任何建议的示例,请发布代码/链接。
答案 0 :(得分:0)
事实上,解决方案是Synclock。我的问题是我锁定了错误的对象objMyClass,而不是当前的我和我没有使用Monitor.PulseAll()。此外,我切换到使用ThreadPool.QueueUserWorkItem(AddressOf objMyClass,args),并在线程完成时引发的自定义事件上使用了SyncLock。它更容易!谢谢!