powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Непонятная ошибка по границам массива
3 сообщений из 3, страница 1 из 1
Непонятная ошибка по границам массива
    #39258184
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Хотел ответить в

Многопоточность

о том, как ограничить число число выполняемых потоков.

Для примера решил немного упростить работающий в приложении код

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplicationTasks
{
    class Program
    {
        static Random rnd;
        static void Main(string[] args)
        {
            int cnt = 100;
            int k = 0;
            int maxk = 10;
            rnd = new Random();
            int[] a = new int[cnt];

            List<Task> tasks = new List<Task>();
            for (int i = 0; i < cnt; i++)
            {
                a[i] = rnd.Next();
                k++;
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    Fignia(a[i]);
                }));

                if (k == maxk)
                {
                    k--;
                    Task.WaitAny(tasks.ToArray());
                }

            }
            Task.WaitAll(tasks.ToArray());

            Console.ReadLine();
        }
        static void Fignia(int r)
        {
            Console.WriteLine(r);
            Thread.Sleep(100);
        }

        static void Fignia()
        {
            Console.WriteLine(rnd.Next());
            Thread.Sleep(100);
        }

    }
}


На выделенном операторе возникает ошибка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
System.IndexOutOfRangeException не обработано пользовательским кодом
  HResult=-2146233080
  Message=Индекс находился вне границ массива.
  Source=ConsoleApplicationTasks
  StackTrace:
       в ConsoleApplicationTasks.Program.<>c__DisplayClass1_1.<Main>b__0() в c:\users\cat2\documents\visual studio 2015\Projects\ConsoleApplicationTasks\ConsoleApplicationTasks\Program.cs:строка 37
       в System.Threading.Tasks.Task.InnerInvoke()
       в System.Threading.Tasks.Task.Execute()
  InnerException: 

Причем в строке
Код: c#
1.
a[i] = rnd.Next();

ошибка не возникает

Значение переменной i в момент ошибки равно cnt , то есть 100.

При вызове суперметода Fignia() ошибок не происходит
При вызове суперметода Fignia(rnd.Next) ошибок не происходит,
...
Рейтинг: 0 / 0
Непонятная ошибка по границам массива
    #39258185
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

это же стационарные грабли с замыканием.

https://habrahabr.ru/post/141270/


скопируй i в локальную переменную внутри цикла или фреймворк освежи (4.5+)
...
Рейтинг: 0 / 0
Непонятная ошибка по границам массива
    #39258194
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИзопропилCat2,

это же стационарные грабли с замыканием.

https://habrahabr.ru/post/141270/


скопируй i в локальную переменную внутри цикла или фреймворк освежи (4.5+)
Спасибо огромное.
Так работает.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplicationTasks
{
    class Program
    {
        static Random rnd;
        static void Main(string[] args)
        {
            int cnt = 100;
            int k = 0;
            int maxk = 10;
            rnd = new Random();
            string[] a = new string[cnt];
            List<Task> tasks = new List<Task>();
            for (int i = 0; i < cnt; i++)
            {
                k++;
                int j = i;
               a[i] = string.Format("{0} {1}", j,k);
               
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    Fignia(a[j]);
                }));

                if (k == maxk)
                {
                    k--;
                    Task.WaitAny(tasks.ToArray());
                }

            }
            Task.WaitAll(tasks.ToArray());

            Console.ReadLine();
        }
        static void Fignia(string r)
        {
            Console.WriteLine(r);
            Thread.Sleep(100);
        }

        static void Fignia()
        {
            Console.WriteLine(rnd.Next());
            Thread.Sleep(100);
        }

    }
}
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Непонятная ошибка по границам массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]