TPL数据流实现网站抓取器。

3
我知道我的问题需要更多的指导而不是技术细节,但我希望SO的成员不会介意一个TPL Dataflow的新手问一些基本的问题。
我有一个简单的Windows Form应用程序,负责从我的系统中提取Excel文件数据并将其保存到数据库中。这个过程太长了,我想让它异步和并行化。下面是我的情况简述。
调用函数在开始时打开与数据库的连接。 调用函数更新操作时间的数据库。 应用程序需要处理假设100个按增量顺序排列的Excel文件。为此,我使用FileNumber来递增每个调用。 调用函数UpdateUI(传递PageNumber)(例如,正在处理文件1)。 调用函数Read Excel file(传递PageNumber)。 调用函数Process Excel file data(传递Excel Data和PageNumber)。 调用函数Save values in the database(传递Excel Data和PageNumber)。 调用函数UpdateUI(传递PageNumber)(例如,已处理文件1)。
现在我已经成功地使用Tasks使这个过程异步化。我对所有长时间运行的操作都使用了async和await,并将我的函数转换为任务。
现在我想让一些任务并行运行。不是每个任务都会并行运行,例如OpenDatabase连接只是异步的。但我想创建一个单独的任务或函数,它将使用Dataflow块从更新UI到ReadingExcel文件和将它们保存到数据库的每个任务/函数中。
我开始使用ActionBlock尝试这个,但有许多不同的块我一无所知。请指导我在这种情况下将使用哪个块。如果有人能够为这种情况提供伪代码,那就太好了。我将有一个起点。
1个回答

1

在学习TPL Dataflow后,我成功地对其及其块有了基本的理解。我将在下面提到我的理解,以便其他人能够更快入手。

TPL Dataflow是建立在TPL(任务并行库)之上的,其主要目的是实现生产者/接收者(actor/agent)设计。

TPL Dataflow由块组成,也称为数据流块。这些数据流块的目的是缓冲、处理和传播数据。每个块都可以是接收者或生产者,也可以同时具备两者身份。

每个块都实现IDataflowBlock,无论其用途(接收者、生产者)。此接口的目的是将一个类作为数据流块。第二个目的是使任何块能够通过成功完成或出现故障来关闭,并最终使这个接口使块异步返回表示块完成的System.Threading.Task。

此外,根据其用途,还有不同的其他接口,例如接收器、生产者或传播器。接收器块实现ISourceBlock,生产者块实现ITargetBlock,传播器实现IPropagatorBlock。

块也可以被归类为其他类别,例如:

>> Execution Blocks
    >> ActionBlock
    >> TransformBlock
    >> TransformManyBlock

>> Buffering Blocks
    >> BufferBlocl
    >> BrodcastBlock
    >> WriteOnceBlock

>> Joining Blocks
    >> BatchBlock
    >> JoinBlock
    >> BatchedJoinBlock

除了这些内置块之外,还可以编写自定义块,但在大多数情况下,这些块已经能够满足需求。此外,我也可以包括每个块的用途,但那样会变成一篇文章。这是我的基本理解,我仍在学习和探索TPL Dataflow。
如果有人想要了解TPL Dataflow,特别是数据爬取方面的内容,则以下是示例数据流块图以帮助更好地理解整个过程。

Web Crawler Demonstration in TPL Dataflow

来源:https://petermeinl.wordpress.com/2012/10/13/a-webcrawler-demonstrating-the-beauty-of-tpl-dataflow/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接