我是C#编程新手。 我想获取使用后台工作服务器列表的更新数量。每个服务器的结果都以列表视图的报告进度方式显示。 我能够使用foreach循环成功获取结果,但在尝试使用并行foreach获得相同结果时,列表视图的所有列和行都会混淆在一起。并行处理混淆
例如: 输出foreach循环: 服务器名称的状态更新可用
- server1的登录服务器失败! 0
- 服务器2更新可用3个
- 服务器3更新可用3
- 服务器4更新0 等..并行的foreach
输出:
- server1的更新可用1
- server1登录到服务器失败! 1
- server2登录服务器失败! 0
- server3登录服务器失败! 0
- server4登录服务器失败! 0
- 服务器4更新可用3 等..
我曾尝试锁定部分代码并且也使用并发袋尝试,但不太能解决这个问题。以下是parallelforeach代码。我做错了什么?任何建议都会有很大的帮助。
Parallel.ForEach(namelist, /*new ParallelOptions { MaxDegreeOfParallelism = 4 }, */line =>
//foreach (string line in namelist)
{
if (worker.CancellationPending)
{
e.Cancel = true;
worker.ReportProgress(SysCount, obj);
}
else
{
this.SystemName = line;//file.ReadLine();
Status.sVariables result = new Status.sVariables();
result = OneSystem(this.SystemName);
switch (result.BGWResult)
{
case -1:
this.StatusString = "Login to server failed!";
break;
//other status are assigned here;
}
SysCount++;
bag.Add(this);
}
Status returnobj;
bag.TryTake(out returnobj);
worker.ReportProgress(SysCount, returnobj);
Thread.Sleep(200);
});
ReportProgress方法:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (!backgroundWorker1.CancellationPending)
{
Status result = (Status)e.UserState;
Complete_label.Visible = true;
if (listView1.InvokeRequired)
listView1.Invoke(new MethodInvoker(delegate
{
listView1.Items.Add("");
listView1.Items[result.SysCount - 1].SubItems.Add(result.SystemName);
listView1.Items[result.SysCount - 1].SubItems.Add(result.StatusString);
listView1.Items[result.SysCount - 1].SubItems.Add(result.AvailableUpdatesCount.ToString());
}));
else
{
try
{
listView1.Items.Add("");
listView1.Items[result.SysCount - 1].SubItems.Add(result.SystemName);
listView1.Items[result.SysCount - 1].SubItems.Add(result.StatusString);
listView1.Items[result.SysCount - 1].SubItems.Add(result.AvailableUpdatesCount.ToString());
}
catch (Exception ex)
{}
//other stuff
}
}
你使用的是什么框架版本? – thomas
输出看起来合法,因为您在注意到存在错误(result.BGWResult == -1)后继续处理。 Perhapse OneSystem不是线程安全的吗? –
你为什么要把PLINQ与后台工作者混在一起?它们实质上已过时 - 使用[进度](https://msdn.microsoft.com/en-us/library/hh193692%28v=vs.110%29.aspx)类来报告进度 –