Запуск нового потока в цикле foreach

У меня есть список объектов, и я хотел бы перебрать этот список и запустить новый поток, передав текущий объект.

Я написал пример того, что, по моему мнению, должно это сделать, но он не работает. В частности, кажется, что потоки перезаписываются на каждой итерации. Для меня это на самом деле не имеет смысла, потому что я каждый раз создаю новый объект Thread.

Это тестовый код, который я написал

class Program
{
    static void Main(string[] args)
    {
        TestClass t = new TestClass();
        t.ThreadingMethod();
    }
}

class TestClass
{
    public void ThreadingMethod()
    {
        var myList = new List<MyClass> { new MyClass("test1"), new MyClass("test2") };

        foreach(MyClass myObj in myList)
        {
            Thread myThread = new Thread(() => this.MyMethod(myObj));
            myThread.Start();
        }
    }

    public void MyMethod(MyClass myObj) { Console.WriteLine(myObj.prop1); }
}

class MyClass
{
    public string prop1 { get; set; }

    public MyClass(string input) { this.prop1 = input; }
}

На моей машине выводится

test2
test2

, но я ожидал, что это будет

test1
test2

. Я попытался изменить строки потоков на

ThreadPool.QueueUserWorkItem(x => this.MyMethod(myObj));

, но ни один из потоков не запустился.

Я просто неправильно понимаю, как должны работать потоки. Может ли кто-нибудь указать мне правильное направление и сказать, что я делаю неправильно?

22
задан Kris Harper 23 February 2012 в 18:00
поделиться

1 ответ

Если последовательность не имеет значения, тогда переходите к

Parallel.ForEach(myList, obj => this.MyMethod(obj) );

Напишите простой параллель. ForEach Loop

1
ответ дан 29 November 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: