【发布时间】:2014-02-25 01:54:52
【问题描述】:
如果这已经得到回答,我提前道歉,但我所做的每一次搜索都没有接近我需要的。还有,这都是伪代码。
情况如下:我创建了一个表单(针对 DOT NET 3.5),它在重新创建类的网格视图上执行循环并运行代码。代码运行后,类中有一个局部变量会被更新并允许我使用它,并且该过程会重复。像这样的:
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 会锁定整个程序。我还尝试添加一个自定义事件,该事件在流程完成时触发并在主窗体上执行委托,但这也不起作用。
现在,我的问题很简单:如何使用同一个基类(传递唯一的字符串变量)运行多个线程,并让本地类变量将正确的结果返回给 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
任何有关如何进行的帮助/建议将不胜感激。而且,如果您知道您的建议的任何示例,请发布代码/链接。
【问题讨论】:
-
看来我比程序员更白痴。
标签: vb.net multithreading loops .net-3.5