【问题标题】:How to use the same class accross multiple threads and return a variable如何跨多个线程使用同一个类并返回一个变量
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 2012-03-06
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多