gpt4 book ai didi

c# - 使用 C# 任务从 SQL 获取行

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:48 27 4
gpt4 key购买 nike

我的表中有大约 300 万行。我有一个控制台应用程序来获取所有行并处理这些行。我想使用 TPL 一次获取 1000 行并执行我的处理逻辑。我可以有以下逻辑,在 ProcessRowsForPage 方法中,我将根据页码获取记录。

int totalRecordsCount = GetCount();
int pagecount = totalRecordsCount/1000;
for (int j= 0; j <= pagecount; j++)
{
var pageNo= j;
var t = Task.Factory.StartNew(() =>
{
ProcessRowsForPage(pageNo);
});
tasks.Add(t);
}

可能很奇怪,但是有没有一种方法可以在没有总数的情况下创建任务。我想使用类似 do while 循环的东西,并在没有更多行要获取时停止创建任务

最佳答案

对于这种情况,您最好使用 TPL Dataflow .

为此,您需要以下组件:

  • SqlDataReader 或其他可以从数据库流式传输数据的东西
  • 一个BatchBlock使用 BatchSize = 1000
  • 一个ActionBlock这将调用 ProcessRows 方法

现在,要创建处理管道,将 block 链接在一起:

batchBlock.LinkTo(actionBlock, new DataflowLinkOptions { PropagateCompletion = true });

之后,从您的 dataReader Post 行到 BatchBlock:

while(reader.Read())
{
var item = ConvertRow(reader);
batchBlock.Post(item);
}
// When you get here you've read all the data from the database
// tell the pipeline that no more data is coming
batchBlock.Complete();

这将负责处理。如果您想在管道处理完所有项目时收到通知,请使用 ActionBlockCompletion 属性来获得通知。

actionBlock.Completion.ContinueWith(prev => {Console.WriteLine("Finished.");}).

关于c# - 使用 C# 任务从 SQL 获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40041128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com