Добавить в список задач потока

Я пытаюсь создать список задач, которые будут вызывать функцию с параметром, являющимся объектом.

Этот объект представляет собой список из 100 других объектов. Затем я отправляю этот список задач Parallel.ForEach для обработки задач.

Я обнаружил, что параметр меняется для всех объектов, что для меня не имеет смысла.

static void Main(string[] args)
{
    var listOfTestTasks = new List<System.Threading.Tasks.Task>();
    List<string> stest = new List<string>();
    for (int i = 0; i < 5; i++)
    {
        stest.Add("Test " + i);
        listOfTestTasks.Add(new System.Threading.Tasks.Task(() => TestFunc(stest)));
    }

}

static private void TestFunc(List<string> test)
{
    int i = test.Count();
}

Можно подумать, что первый элемент в listOfTestTasks будет содержать вызов TestFunc с sTest, содержащим одну запись "Test 0".

Это не так, все элементы в listOfTestTasks имеют "TestFunc" с параметром, содержащим sTest со списком из 5 строковых значений от "Test 0" до "Test 4".

Для меня это не имеет никакого смысла, и я тут что-то делаю неправильно.

wolfpack.pe.kr/123 это вам поможет. вам нужно подумать о блокировке, когда несколько потоков обращаются к одним и тем же переменным. даже этот сайт, написанный на корейском языке, я думаю, он даст вам представление о том, каким будет ваш код.
Arphile 26.10.2018 06:05

Каждая задача обращается к одному и тому же экземпляру списка после того, как все задачи были созданы, и поэтому они должны возвращать один и тот же результат.

Sir Rufo 26.10.2018 06:07

Короче говоря, к тому времени, когда вы запускаете свои задачи (и они запускаются), stest уже заполнен 5 значениями

TheGeneral 26.10.2018 06:11

Чего вы хотите достичь? или вы просто хотите пояснить, почему

TheGeneral 26.10.2018 06:13

Моя цель - вызвать функцию с разными значениями. В моей реальной программе я пытаюсь отправить List <object> в функцию, и этот List <object> содержит разное количество объектов и, конечно же, каждый объект, загруженный с разной информацией. Происходит то, что может быть 500 задач, но все они проходят sTest с последней итерации.

Filjan 26.10.2018 15:12
0
5
163
0

Другие вопросы по теме