Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行Web服务循环跳过_C#_Web Services - Fatal编程技术网

C# 并行Web服务循环跳过

C# 并行Web服务循环跳过,c#,web-services,C#,Web Services,我使用并行循环来调用Web服务,因为单个for循环太慢。但是,结果显示跳过了部分项目 代码: 但结果是 3 8581892 41.10 1 9281989 10.99 50 4199289 02.22 它杂乱无章,而且丢失了很多数据 如何使其有序并确保所有数据都被表示出来?您是否应该期望Literal1.Text+=…是线程安全的还不清楚。我建议您使用Parallel.For循环来收集数据,然后更改Literal1.Text 例如,您可以编写: var results = new Whatev

我使用并行循环来调用Web服务,因为单个for循环太慢。但是,结果显示跳过了部分项目

代码:

但结果是

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();
var results=newwhatevertype[phoneNo.Count];
对于(0,电话号码计数,
index=>results[index]=webserviceClass123.callWebserviceMethod(phoneNo[index]);
var builder=新的StringBuilder();
for(int i=0;i”,
i、 电话号码[i],结果[i];
}
Literal1.Text=builder.ToString();
使用并行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();
var results=phoneNo
.天冬酰胺()
.选择(编号=>新建{
数字,
结果=webserviceClass123.callWebserviceMethod(编号)
})
.AsOrdered()
托利斯先生()
var builder=新的StringBuilder();
foreach(int i=0;i”,
i、 结果[i]。编号,结果[i]。结果);
}
Literal1.Text=builder.ToString();

您正在编写什么样的应用程序?(WinForms、WPF、ASP.NET等?)我尝试了第二个示例,但得到了一个错误,因为Ordered只能在AsParallel、ParallelEnumerable.Range或ParallelEnumerable.Repeat的结果上调用。我尝试了第一个示例,并对其进行了一些编辑,结果成功了。但我想试试第二个,但不知道怎么做works@Bloopie:我建议您搜索并行LINQ教程
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();
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();