c# - 并行 Webservice 循环跳过

标签 c# web-services

我正在使用并行循环来调用网络服务,因为单独的 for 循环太慢了。然而,结果跳过了一些项目。

代码:

private void readCSV(string FilePath, string Extension)
{
    switch (Extension)
    {
        case ".csv":
            var reader = new StreamReader(File.OpenRead(FilePath));
            int counter = 0;
            List<int> phoneNo = new List<int>();

            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                phoneNo.Add(int.Parse(line));
            }
            reader.Close();

            Parallel.For(0, phoneNo.Count, (index) =>
            {
                counter++;
                Literal1.Text += counter + " " + phoneNo[index] + " " + webserviceClass123.callWebserviceMethod(phoneNo[index]) + "<br/>";
            });

            break;
    }
}

所以结果应该是(例子)

1 4189291 40.10
2 5124910 23.10
3 5123145 12.11
...
...
50 4124919 20.58

但结果是

3 8581892 41.10
1 9281989 10.99
50 4199289 02.22

乱七八糟的,遗漏了很多数据

我如何让它井然有序并确保所有数据都得到体现?

最佳答案

您还不清楚您是否应该期望 Literal1.Text += ... 是线程安全的。我建议您使用Parallel.For 循环只是 来收集数据,然后再更改Literal1.Text

例如,你可以这样写:

var results = new WhateverType[phoneNo.Count];
Parallel.For(0, phoneNo.Count,
    index => results[index] = webserviceClass123.callWebserviceMethod(phoneNo[index]));

var builder = new StringBuilder();
for (int i = 0; i < phoneNo.Count; i++)
{
    builder.AppendFormat("{0} {1} {2}<br/>",
        i, phoneNo[i], results[i]);
}
Literal1.Text = builder.ToString();

使用 Parallel LINQ 可能会更简洁:

var results = phoneNo
    .AsParallel()
    .Select(number => new { 
         number, 
         result = webserviceClass123.callWebserviceMethod(number)
    })
    .AsOrdered()
    .ToList()

var builder = new StringBuilder();
foreach (int i = 0; i < results.Count; i++)
{
    builder.AppendFormat("{0} {1} {2}<br/>",
        i, result[i].number, results[i].result);
}
Literal1.Text = builder.ToString();

关于c# - 并行 Webservice 循环跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30000424/

相关文章:

javascript - 如何在 React Native 中使用服务器实现发布/订阅功能

java - 在 Java 客户端中使用 C# 的 webmethods

java - 如何从 java 中的 web 服务获取属性文件的上下文路径?

python - 创建简单 python web 服务的最佳方法

c# - 尝试删除在 .NET MVC 中插入时早于 X 天的文件

c# - 我是一位经验丰富的 C# 开发人员,我应该了解哪些内容才能有效地使用 C/C++ 进行编码?

c# - 如何使用 LINQ 在函数中定义返回类型?

c# - 如何设置MongoDB自动为每个子文档分配ID?

c# - Visual Studio 使用 Runtime.Serialization 生成我的服务引用之一,但其他使用 ServiceModel 生成

c# - 以编程方式调用 DockPanel-Suite 的 "AutoHidden"DockContent