繁体   English   中英

Parallel.ForEach的奇怪行为

[英]Strange behavior of Parallel.ForEach

我有以下代码:

Parallel.ForEach(xRoot.Elements("key"), xKey =>
{
    int id = int.Parse(xKey.Attribute("id").Value);
    string code = xKey.Attribute("code").Value;

    AccountStatus accountStatus = SomeClient.GetAccountStatusAsync(id, code).Result;
);

xRoot.Elements(“ key”)的计数为3,但是ForEach仅迭代2次。 为什么?

混合Parallel.ForEachasync/await 不是一个好主意 你不需要异步方法并行执行,你需要他们同时执行。 您当前的代码使用线程池线程来阻止 I / O操作,从而缺少异步api的优势。

尝试这个:

var codeIds = xRoot.Elements("key").Select(xKey => new { Id = int.Parse(xKey.Attribute("id").Value, Code = xKey.Attribute("code").Value  });

var codeTasks = codeIds.Select(x => SomeClient.GetAccountStatusAsync(x.Id, x.Code));

await Task.WhenAll(codeTasks);

尝试:

Parallel.ForEach(xRoot.Elements("key"), async xKey =>
{
   int id = int.Parse(xKey.Attribute("id").Value);
   string code = xKey.Attribute("code").Value;

   AccountStatus accountStatus = await SomeClient.GetAccountStatusAsync(id, code);
);

要么:

Parallel.ForEach(xRoot.Elements("key"), xKey =>
{
   try
   {
      int id = int.Parse(xKey.Attribute("id").Value); // maybe null reference here?
      string code = xKey.Attribute("code").Value; // or here?

      AccountStatus accountStatus = SomeClient.GetAccountStatusAsync(id, code).Result; // or even here?
   }
   catch (Exception ex)
   {
      throw; // add here a breakpoint and check what's up by checking 'ex' object
   }
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM