如何避免在多线程处理中重写类?
Posted
技术标签:
【中文标题】如何避免在多线程处理中重写类?【英文标题】:How to avoid the class rewritten in multi thread processing? 【发布时间】:2016-05-27 18:24:07 【问题描述】:我编写这段代码是为了使用并行处理:
var charge = new Charge[Job.Jobs.Length];
for (int i = 0; i < Job.Jobs.Length; i++)
charge[i] = new Charge
ID = Convert.ToInt64(Job.Jobs[i].Parameters),
Job = new SystemJob ID = Job.Jobs[i].ID, Type = Job.Type ,
;
var status = charge[i].GetSubscribeInformation();
if (status == false)
continue;
Task.Run(() => charge[i].Subscribe());
//before task runs, the i value changes and causes error.
问题是在Task.Run(() => charge[i].Subscribe());
执行之前i
值发生变化并导致错误。我怎样才能避免这种情况?
我可以等到Task.Run()
之后,但这似乎不是一个好主意。我有什么选择?
【问题讨论】:
你考虑过使用Parallel.ForEach
- msdn.microsoft.com/en-us/library/dd460720%28v=vs.110%29.aspx
我从未听说过。你能解释一下吗?
查看我评论中的链接
【参考方案1】:
您正在将迭代索引用于闭包:
Task.Run(() => charge[i].Subscribe());
你必须把它复制到本地值:
var localI = i;
Task.Run(() => charge[localI].Subscribe());
您还可以使用Parallel
类摆脱任务创建,正如@Bauss 建议的那样(我在这里假设您已经实例化了您的数组charge
变量)(针对return
用法更新了代码):
Parallel.ForEach(charge, (c) =>
var status = c.GetSubscribeInformation();
if (!status)
return;
c.Subscribe();
// some other code here
);
您也可以取消对布尔条件的检查:
if (status == false)
等同于:
if (!status)
【讨论】:
智能。谢谢男人。我应该改用 Parallel.for 吗? @Dan 为Parallel.Foreach
添加了一些示例代码,Parallel.For
在使用上完全一样。
非常感谢。为什么我不能使用继续?这对我来说很重要。
这段代码作为一个单独的方法运行,所以你应该使用return
,而不是继续。我已经更新了代码以上是关于如何避免在多线程处理中重写类?的主要内容,如果未能解决你的问题,请参考以下文章