【问题标题】:Is it possible to introduce multi threading in dotnet without explicity creating new threads?是否可以在不明确创建新线程的情况下在 dotnet 中引入多线程?
【发布时间】:2011-03-09 23:37:49
【问题描述】:

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

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

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

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

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

此异常违反了外键约束,但表明它是针对没有业务连接的 SQLConnection 操作的。

我当然对此感到担忧,但据我所知,此应用程序中没有多线程代码。

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

编辑:

  • VB.Net 3.5SP1
  • 控制台应用程序 + 类库
  • 偶尔调用网络服务
  • 进行 SQL 调用
  • 没有太多其他的东西。没有 Winforms,没有 WPF。

【问题讨论】:

  • 您可能想明确您正在使用的除了套接字(WCF、WinForms...)之外的库类型。
  • 网络服务?对我来说这听起来像是插座:)

标签: sql multithreading parallel-processing reentrancy


【解决方案1】:

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

如果计时器是 AutoReset(在调用 elapsed 后保持启用),您可能会同时调用同一处理程序。

【讨论】:

  • 有趣。没有直接引用该类。但是有对 System.Threading.Thread.Sleep(1000) 的调用。这会导致类似情况吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    但是:

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

    【讨论】:

    • 好建议 - 赞成。但是,此代码中没有使用套接字。 .Net 3.5(应该提到)所以没有任务
    • 只是出于好奇,如果您不使用套接字,您是否使用管道?您在问题中提到了一个联系。
    • 对不起,我的意思是到数据库的 SQLConnection。有几个数据库可供选择。都具有相似的结构。我已经修改了我的问题以反映这一点。
    • 我根本不是 C# 的 SQL 专家,但很可能 API 有异步事件。 IE。执行请求时,请确保通过阻塞调用而不是指定回调来获得结果。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多