System.Threading.Tasks.Parallel

У меня проблемы с получением идеального результата с помощью Parallel.

Что я сделал

protected void Page_Load(object sender, EventArgs e)
{
    List<int> listInt = new List<int>();
    for (int i = 0; i < 10000; i++)
    {
        listInt.Add(i);

    }
    int cnt = 0;
    Parallel.ForEach(listInt, num =>
        {
            cnt++;
        }
    );
    System.Threading.Thread.Sleep(0);
    //it should show 10000 but it gives random result
    Response.Write(cnt);
}

Я ожидал получить 10000 в качестве ответа, но это дает случайный результат.

Что я делаю не так, чтобы получить точный результат.

Тестирование здесь.

Большое спасибо.


person Nazmul    schedule 20.12.2013    source источник
comment
на это, вероятно, много ответов - например. stackoverflow.com/ вопросы/2394447/   -  person NDJ    schedule 20.12.2013


Ответы (2)


Ваш код не является потокобезопасным.

Вы можете использовать что-то вроде этого:

private static readonly object SyncRoot = new object();

и

lock (SyncRoot)
{
    cnt++;
}

Проверьте этот dotnetfiddle http://dotnetfiddle.net/D7QoP9

person arpad    schedule 20.12.2013
comment
Поместите соответствующие биты кода в свой пост, так что если скрипка исчезнет в будущем. - person crthompson; 20.12.2013
comment
@arpad, большое спасибо. - person Nazmul; 20.12.2013

Ваш код не является «поточно-ориентированным», то есть «гонкой».

Добавьте блокировку вокруг cnt++, чтобы увидеть ожидаемый результат.

Или просто используйте

Interlocked.Increment(ref cnt);
person Sriram Sakthivel    schedule 20.12.2013