Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 如何避免在多线程处理中重写类?_C#_.net_Multithreading_Wcf_Parallel Processing - Fatal编程技术网

C# 如何避免在多线程处理中重写类?

C# 如何避免在多线程处理中重写类?,c#,.net,multithreading,wcf,parallel-processing,C#,.net,Multithreading,Wcf,Parallel Processing,我编写此代码是为了使用并行处理: 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 =

我编写此代码是为了使用并行处理:

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.
}
var费用=新费用[Job.Jobs.Length];
for(int i=0;icharge[i].Subscribe());
//在任务运行之前,i值会更改并导致错误。
}
问题出现在
任务之前。运行(()=>charge[i].Subscribe())执行
i
值更改并导致错误。如何避免这种情况?

我可以等到
Task.Run()
之后,但这似乎不是一个好主意。我有什么选择?

您正在将迭代索引用于闭包:

Task.Run(() => charge[i].Subscribe());
必须将其复制到本地值:

var localI = i;
Task.Run(() => charge[localI].Subscribe());
此外,您还可以使用@Bauss建议的
Parallel
类来摆脱任务创建(我假设您已经实例化了数组
charge
变量)(针对
return
用法更新了代码):

您还可以删除布尔条件检查:

if (status == false)
同:

if (!status)

你有没有考虑过使用
Parallel.ForEach
——我从没听说过。请你解释一下好吗?请看我评论中的链接。谢谢男人们。我应该改用Parallel.for吗?@Dan为
Parallel.Foreach
Parallel.for
添加了一些示例代码。非常感谢。为什么我不能使用continue?这段代码是作为一个单独的方法运行的,因此您应该使用
返回
,而不是继续。我已经更新了代码
if (!status)