我遇到问题,vb.net
首先,我想告诉我之前(仅在学校)我没有使用过线程,我阅读了很多关于它的网页,但是没有一个能帮我解决问题。
我的主要问题是理解逻辑,如果可能的话,解决我所拥有的问题,两者都是相关的,那么我将解释这个问题。
代码没有相关的评论和/或文档,并且是很多年前开发的程序,这样做的人不在办公室工作,没有人知道它是如何工作的:S
我有一个名为listOfProccess的列表,何时只有1可以正常工作。
在QueueUserWorkItem
的回调函数中填写有关p
的信息,然后执行该线程,我想
该列表包含信息类型为
的数组listOfProccess[].type = 'a/b/c/d/e/f/g/'
该列表还包含一个ID。
代码:
If listOfProccess.Count > 0 Then
Threading.ThreadPool.SetMinThreads(1, 1)
Threading.ThreadPool.SetMaxThreads(4, 4)
For Each p In listOfProccess
Try
Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(Object p.function))
Catch e As Exception
sendMail("mail@mail", "alerts@mail.ie", "", e.StackTrace)
End Try
Next
问题: 我有两个问题:
有时候会在列表中执行一项,即' a'在一个无限循环,并消耗机器的所有资源,但如果我关闭并重新启动,工作,我不知道是否是线程的问题,真诚地我认为这是另一回事,因为这问题从两周或一周前开始,程序仍然在一年内运行。
我认为这个与线程有关,如果我在列表中有两个(或更多)p,就像这样:
p[1].type = 'a/b/c/d/e/f/g/'
p[1].ID = 1
p[2].type = 'ww/xx/ff/yy/aa/rr/'
p[2].ID =2
当系统执行类似这样的操作时,它遵循的方式是随机的'即。取第一个,a, b,c
,然后它ww
,然后回到第一个。如果列表中有更多项目,例如4或5,问题就更大了;这不是一个非常大的问题,因为程序有效,它不能100%正常工作,但是工作,更多的是尝试理解它为什么会这样工作。
欢迎任何帮助。
答案 0 :(得分:1)
第二个问题是race condition
问题,因为您无法保证线程执行的顺序,您的线程将替换彼此的值的概率非零。有很多方法可以解决这个问题:algorythms(面向锁定和无锁),同步技术等等,并且没有silver-bullet
解决方案。
第一个问题对我来说不清楚,因为我无法理解a infinite loop
究竟是什么意思 - 如果将项目链接到已删除(来自其他线程)并且没有办法可能会发生这种情况离开你的任务,因为列表中的链接被破坏了。这仍然应该通过同步来解决。
我认为你应该从一般的MSDN文章或一些关于多线程的书开始,之后你应该逐步拆分你理解的小部分程序。
更新
p.function
- 关于无限循环,你应该考虑这个委托的代码。如果有重新启动工作的条件,则应检查递归限制。例如,如果有an optimistic locking algorythm,您的代码可以发现它尝试的更新无效,并且重新启动它。如果链接被破坏,它将永远不会结束它的任务,并将永远处于无限循环中。