是否可以在没有明确创建新线程的情况下在dotnet中引入多线程?

问题描述:

我有一个需要处理的几百个项目的循环。是否可以在没有明确创建新线程的情况下在dotnet中引入多线程?

每个项目通过有条件地设置,其中所述项是使用此的SQLConnection作为处理的一部分处理的全球的SQLConnection处理。

由于这个原因,所有这些项目都不允许并行处理是至关重要的。

我明白,这是不好的设计,我希望能尽快实用纠正它。

但是它似乎是,尽管我尽了最大努力,该代码正在经历某种形式的多线程的。不知何故,其中一个任务引发了一个异常。

这个例外是在违反外键约束的,但表明它是针对它没有业务连接的SQLConnection运行。

当然,我对此有顾虑,但据我所知,在这个程序没有多线程代码。

不知是否有可能引入多线程没有明确地创建新线程

编辑:

  • VB.Net 3.5SP1
  • 控制台应用程序+类库
  • 偶尔电话网络服务
  • 使SQL调用
  • 没什么别的。没有Winforms,没有WPF。
+0

您可能想要确定您正在使用的套接字(WCF,WinForms,...)以外的类型的库。 – 2011-03-09 14:35:06

+0

Webservices?这听起来像插座:) – 2011-03-09 14:41:22

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

如果计时器自动复位(经过被称为启用后遗体),你可能会导致另一个调用相同的处理同时进行。

+0

有趣。没有直接引用该类。但是有对System.Threading.Thread.Sleep(1000)的调用。这可能导致类似吗? – 2011-03-09 14:36:44

+0

Nope - Sleep只会暂停当前线程。 – 2011-03-09 15:33:51

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

哦,还有异步套接字以及所有其他的异步IO。

但是:

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

+0

好的建议 - upvoted。但是在这段代码中没有使用套接字。和.Net 3.5(应该提到),所以没有任务 – 2011-03-09 14:34:03

+0

只是出于好奇,如果你不使用套接字,你是否使用管道?你在你的问题中提到了一个连接。 – 2011-03-09 14:38:10

+0

对不起,我的意思是一个SQLConnection到数据库。有几个数据库可能会被选中。全部具有相似的结构。我已经修改了我的问题以反映这一点。 – 2011-03-09 14:43:04

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

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