gpt4 book ai didi

c# - Task.Run 在 for 循环中

转载 作者:太空狗 更新时间:2023-10-29 23:37:08 25 4
gpt4 key购买 nike

我有一个 for 循环,里面有

首先:我想计算运行所需的 SQL

第二:异步运行 SQL,无需等待它们在循环中单独完成

我的代码如下:

for (
int i = 0;
i < gm.ListGroupMembershipUploadDetailsInput.GroupMembershipUploadInputList.Count;
i++)
{
// Compute
SQL.Upload.UploadDetails.insertGroupMembershipRecords(
gm.ListGroupMembershipUploadDetailsInput.GroupMembershipUploadInputList[i],max_seq_key++,max_unit_key++,
out strSPQuery,
out listParam);

//Run the out SPQuery async
Task.Run(() => rep.ExecuteStoredProcedureInputTypeAsync(strSPQuery, listParam));
}

单独 DAL 类中的 insertGroupMembershipRecords 方法如下所示:

public static GroupMembershipUploadInput insertGroupMembershipRecords(GroupMembershipUploadInput gm, List<ChapterUploadFileDetailsHelper> ch, long max_seq_key, long max_unit_key, out string strSPQuery, out List<object> parameters)
{
GroupMembershipUploadInput gmHelper = new GroupMembershipUploadInput();
gmHelper = gm;
int com_unit_key = -1;
foreach(var item in com_unit_key_lst){
if (item.nk_ecode == gm.nk_ecode)
com_unit_key = item.unit_key;
}

int intNumberOfInputParameters = 42;
List<string> listOutputParameters = new List<string> { "o_outputMessage" };
strSPQuery = SPHelper.createSPQuery("dw_stuart_macs.strx_inst_cnst_grp_mbrshp", intNumberOfInputParameters, listOutputParameters);
var ParamObjects = new List<object>();

ParamObjects.Add(SPHelper.createTdParameter("i_seq_key", max_seq_key, "IN", TdType.BigInt, 10));
ParamObjects.Add(SPHelper.createTdParameter("i_chpt_cd", "S" + gm.appl_src_cd.Substring(1), "IN", TdType.VarChar, 4));
ParamObjects.Add(SPHelper.createTdParameter("i_nk_ecode", gm.nk_ecode, "IN", TdType.Char, 5));

// rest of the method
}

但是如果我尝试了 2k 的 list Count

它没有在数据库中插入 2k 条记录,而只有 1 条记录。

为什么这不会插入输入列表中的所有记录?

我错过了什么?

最佳答案

Task.Run in a for loop

虽然这不是问题,但标题本身就是我要解决的问题。对于 CPU 绑定(bind)操作,您可以使用 Parallel.ForParallel.ForEach,但由于我们是 IO 绑定(bind)(即,数据库调用),我们应该重新考虑这种方法。

这里显而易见的答案是创建代表异步操作的任务列表,然后使用 Task.WhenAll API 等待它们,如下所示:

public async Task InvokeAllTheSqlAsync()
{
var list = gm.ListGroupMembershipUploadDetailsInput.GroupMembershipUploadInputList;

var tasks = Enumerable.Range(0, list.Count).Select(i =>
{
var value = list[i];
string strSPQuery;
List<SqlParameter> listParam;
SQL.Upload.UploadDetails.insertGroupMembershipRecords(
value,
max_seq_key++,
max_unit_key++,
out strSPQuery,
out listParam
);

return rep.ExecuteStoredProcedureInputTypeAsync(strSPQuery, listParam);
});

await Task.WhenAll(tasks);
}

关于c# - Task.Run 在 for 循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242493/

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