C#数据流块能否拥有状态?

C#数据流块能否拥有状态?,c#,multithreading,tpl-dataflow,C#,Multithreading,Tpl Dataflow,我正在学习C#TPL数据流,并熟悉了一些基本模块。但是,我开始想知道如何为我的应用程序配置更高级的块 例如,假设我有一个动作块,它接收整数并将它们写入数据库。当我配置这个动作块时,似乎我只是给它一个无状态函数,以便在它接收数据时执行 然而,似乎这个块应该负责建立和监视数据库连接,从而使数据流块拥有一个状态 此外,假设我希望此操作块具有一个“scaling”属性,它可以在写入数据库之前缩放数据。我还希望此缩放属性可以调整,以便有人可以动态更改缩放因子 在这两种情况下,动作块似乎需要了解某些状态 构

我正在学习C#TPL数据流,并熟悉了一些基本模块。但是,我开始想知道如何为我的应用程序配置更高级的块

例如,假设我有一个动作块,它接收整数并将它们写入数据库。当我配置这个动作块时,似乎我只是给它一个无状态函数,以便在它接收数据时执行

然而,似乎这个块应该负责建立和监视数据库连接,从而使数据流块拥有一个状态

此外,假设我希望此操作块具有一个“scaling”属性,它可以在写入数据库之前缩放数据。我还希望此缩放属性可以调整,以便有人可以动态更改缩放因子

在这两种情况下,动作块似乎需要了解某些状态


构建具有状态的数据流块的典型过程是什么?

使用数据库执行多任务时,我将并发性留给数据库。我还有一个长期的建议,不要保持数据库连接打开。创建、使用、处置。都在同一段代码中,ideall使用using块。在这种情况下,没有什么需要注意的。@Christopher TPL和DB最佳实践之间存在差异。@Chuchđxěŕ实际DB将成为两种方式的瓶颈。它被设计成瓶颈。将瓶颈/并发性从it移开会导致问题。分割连接的创建和处理将导致问题。多任务已经很难了,你想避免任何额外的问题无论你变得多么老练,永远不要忘记初学者的错误是非常重要的。@Izzo在写入数据库之前,
缩放数据是什么意思?在任何情况下,都不需要状态或持久连接。将数据插入数据库的最快方法是使用其大容量导入机制,如SQL Server的
大容量插入
SqlBulkCopy
。根据您使用的行数,您可以使用
BatchBlock
将行批处理为5K行批处理,并在末尾使用
ActionBlock
打开连接并使用
SqlBulkCopy
将其全部写出来。@Izzo SQL Server SSIS数据流也是这样工作的。每个步骤都是一个单独的块。转换从输入缓冲区提取数据,对其进行处理并将其发送到输出缓冲区。有些缓存数据,有些不缓存。SSIS在每个目的地使用一个连接,而带有ActionBlock的一个(并非如此)简单的实现将打开一个新的连接——由于连接池,它实际上是免费的。