是否有可能在dotnet中引入多线程而无需明确创建新线程?

时间:2011-03-09 14:24:30

标签: sql multithreading parallel-processing reentrancy

我有一个需要处理的数百个项目的循环。

通过有条件地设置全局SQLConnection来处理每个项目,其中在处理项目时使用此SQLConnection作为处理的一部分。

因此,至关重要的是,不允许并行处理这些项目。

我很欣赏这不是好设计,我希望尽快纠正它。

然而,尽管我付出了最大的努力,但这段代码似乎正在经历某种形式的多线程。不知何故,其中一个任务抛出异常。

此异常违反了外键约束,但表示它正在对没有业务连接的SQLConnection进行操作。

当然我对此有疑虑,但据我所知,此应用程序中没有多线程代码。

我想知道是否可以在不明确创建新线程的情况下引入多线程

编辑:

  • VB.Net 3.5SP1
  • 控制台应用+类库
  • 偶尔会调用Web服务
  • 进行SQL调用
  • 没什么别的。没有Winforms,没有WPF。

4 个答案:

答案 0 :(得分:1)

是 - 使用System.Timers.Timer和/或System.Threading.Timer会导致您描述的效果。每当计时器打勾时,新工作项在ThreadPool中排队 - 所以基本上你有一个多线程程序而没有显式创建新线程。

如果计时器是AutoReset(在调用elapsed后仍保持启用状态),则可能会同时再次调用同一个处理程序。

答案 1 :(得分:1)

或者,任务(即Task对象)不是调用线程,而是。通常在lambda表达式附近找到任务,检查是否有任何。

哦,还有异步套接字和所有其他异步IO。

BUT:

不是不惜一切代价避免多线程,而不是更容易锁定?对不起,如果问题很幼稚,我可能会错过一些东西。

答案 2 :(得分:1)

除了已提到的其他内容:并行扩展(PLINQ和任务并行库)。

答案 3 :(得分:0)

可能是您的代码是从第三方库调用的。通过使用事件,另一个库可以调用您的代码 - 来自尽可能多的线程 我建议您检查调用更改代码的代码,并确保没有可疑的代码调用。