【问题标题】:How to use C# 4.0 tasks feature with these properties - assigning variables on run time - keep certain number of tasks alive如何使用具有这些属性的 C# 4.0 任务功能 - 在运行时分配变量 - 保持一定数量的任务处于活动状态
【发布时间】:2011-10-02 12:27:20
【问题描述】:

好吧,我已经搜索了好几天,但没有我想要实现的示例。目前我可以使用任务进行多线程爬行,但写得非常糟糕。你可以从这里看到整个代码:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/6fa6fd12-85c5-4489-81b1-25bc0126d406

现在我的问题来了。我想使用 System.Threading.Tasks.Task 进行多线程。开发的是 microsoft visual studio 2010 和 C# 4.0。

我需要的是

1-) 我想一直保持一定数量的任务运行。因此,当一个线程完成其工作时,另一个线程应该立即开始工作。通过这种方式,一定数量的线程将始终处于活动状态。

2-) 我需要能够在运行时提供任务变量。所以想想我有一个链接池。我从前 100 个开始,但可以说第 45 个任务首先完成。因此将创建另一个任务,该任务将占用第 101 个链接。当另一个完成时,它将以这种方式继续,并且始终有一定数量的任务将处于活动状态。

3-) 我需要能够收集任务的结果。任务完成后以某种方式收集结果。这部分似乎是最简单的部分。

我发现的哪个任务示例只显示了 2 个任务或 3 个任务,使某些变量在运行时没有改变,也没有使某些数字保持活动状态。多线程应用程序是未来,但文档太糟糕了。

【问题讨论】:

    标签: c# c#-4.0 parallel-processing task multitasking


    【解决方案1】:

    您是否查看过TPL-DataFlow CPL:

    TPL 数据流 (TDF) 是一个新的 .NET 库,用于构建并发 应用程序。它通过以下方式促进面向参与者/代理的设计 用于进程内消息传递、数据流和流水线的原语。 TDF 建立在 API 和调度基础设施之上 .NET 4 中的任务并行库 (TPL),并与 C#、Visual Basic 和 F# 提供的异步语言支持。

    这是 beta 但我认为您的问题不在于线程。 似乎您正在尝试构建某种基于代理的编程模型,而这个 DataFlow 为您提供了一些非常好的工具。

    这是Homepage,这是一个不错的video

    【讨论】:

    • 感谢您的回答。我真的需要例子来理解。现在正在下载视频。其实我正在尝试制作一个爬虫。我打算做一个像谷歌购物这样的系统。这将是土耳其。所以需要抓取很多产品销售网站,我真的需要编写我的爬虫并完全控制它。
    • 没问题 - 我在第一个链接中发布的简介中的例子是正确的 - 但我可以在那里插入第一个
    • 你刚刚注意到 docx 文件也会检查这一点。其实我需要的很简单。一个任务处理程序,它将在任务完成其工作时创建新任务。因此,当任务完成其工作时,它将回调到任务处理程序,并且任务处理程序将创建另一个任务。这里重要的是变量将在运行时分配。任务处理程序还将保持一定数量的线程处于活动状态。
    • 这或多或少就是您所说的基于代理的系统。只是你并不真正关心线程。您描述的是一个输入缓冲区和一个读取输入并对其进行处理的单个使用者。如果您想要其中的几个,只需运行几个消费者。编写 TDF 时考虑到了这一点。
    【解决方案2】:

    为什么需要一定数量的任务?让池/API 决定。

    将数据传递给任务就像将数据传递给线程:共享一个数据结构。

    使用 Task 从任务中返回结果

    编辑

    您无法设置工作线程数或 I/O 数 完成线程数小于处理器数 在电脑里。

    如果公共语言运行时是托管的,例如通过 Internet 信息服务 (IIS) 或 SQL Server,主机可以限制或 防止更改线程池大小。

    更改线程中的最大线程数时要小心 水池。虽然您的代码可能会受益,但更改可能会产生不利影响 对您使用的代码库的影响。

    将线程池大小设置得太大会导致性能问题。 如果同时执行的线程太多,任务切换 开销成为一个重要因素。

    (from the MSDN)

    确实,您永远无法强制激活特定数量的任务。只需创建任务并让运行时决定哪些应该/可以运行。

    如果您不喜欢这样,请不要使用 TPL 并带上您自己的线程。

    【讨论】:

    • 对不起,我必须保持一定数量的任务活着,这是必须的。可能我会为这个问题设置 250 赏金,因为它真的很重要。我将为我的硕士学位论文编写一个完整的规范爬虫,所以在运行时我必须能够将变量传递给线程。
    • @MonsterMMORPG:然后解释为什么我们可以提供更好的帮助。活动任务的数量取决于线程池中的线程数量。线程数取决于硬件和可用内存,因此因机器而异。看到这个:msdn.microsoft.com/en-us/library/0ka9477y.aspx
    • 你认为核心号码相关的权利?好吧,我将不执行诸如获取网站之类的核心耗电任务。所以我需要能够一直活着完成一定数量的任务。获取网站完全取决于您的网络质量。如果您曾经使用过一些质量工具,它们都可以让您决定活动线程数。
    • 不,你没有。是的,您可以指定线程数,但不能强制它们处于活动状态。在我的回答中查看我的编辑。
    • Erno 请检查此线程。我发布了我当前爬虫的完整源代码。即使那个糟糕的代码也能够维持给定数量的线程活着:) social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/… 我认为你误解了我的意思。当一个线程完成其工作时,另一个线程将开始工作。所以活动线程的总数总是一定的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多