c# - Parallel task execution order -


i have following code:

public ienumerable<task> executejobs(action[] pjobstoexecute) {     var tasks = new task[pjobstoexecute.length];     (int = 0; < pjobstoexecute.length; i++)     {         //tasks[i] = new task((index) => processjob(pjobstoexecute[(int)index], (int)index), i);         //tasks[i].start();         tasks[i] = new task(() => processjob(pjobstoexecute[i], i));         tasks[i].start();     }      return tasks; }  public void processjob(action jobtoprocess, int index) {     // ... } 

i need log order of tasks being sent processjob method, use index parameter this. code:

tasks[i] = new task(() => processjob(jobs[i], i)); tasks[i].start(); 

will not give correct order in actions executed. code give correct order:

tasks[i] = new task((index) => processjob(pjobstoexecute[(int)index], (int)index), i); tasks[i].start(); 

i don't understand why overload task fixes issue. passed index parameter based on actual order of execution? or have tests been incorrect , code fail?

the problem creating closure on loop variable i , using value later on, after loop has progressed.

when creating lambda function () => processjob(jobs[i], i) compiler creates hidden reference variable i updated for loop. same reference read when processjob called part of task being executed.

the behavior see result of race condition: though starting tasks inside loop, tasks run on separate threads , threads not start executing immediately. when do start value of i has been modified (because more iterations of loop have been completed) , value read processjob "wrong".

the version index variable creates local copy of i logically separate , not modified i; copy therefore immune being changed before task has chance start. same (correct) behavior with:

var index = i; // note tasks[index] can tasks[i] -- makes no difference // because value used strictly during current loop iteration tasks[index] = new task(() => processjob(pjobstoexecute[index], index)); tasks[index].start(); 

creating local copy of captured variables above solution problems of type.


Comments

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -