Создание массива занимает много времени - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Нужен совет. В процессе написания некой программы, возникла надобность в создании больших массивов объектов типа Label. В итоге программа очень долго работает над созданием массива размером 4096 ячеек.
Label[] labels = new Label[4096];
Массив большей размерности вообще отказывается создавать. Виснет. Как можно ускорить работу программы? Мне в голову пока пришёл способ распараллелить задачу на несколько потоков с тем, чтобы каждый поток создавал фрагмент общего массива, а затем сливать их в одно целое. Может быть есть ещё варианты? Спасибо.

Решение задачи: «Создание массива занимает много времени»

textual
Листинг программы
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplicationTest2 {
    public partial class Form1 : Form {
        private const int Rows = 64;
        private const int Columns = 64;
 
        private readonly Pixel[,] pixels;
 
        public Form1() {
            InitializeComponent();
 
            // Создаём пиксели
            pixels = new Pixel[Rows,Columns];
            for ( int i = 0; i < Rows; i++ ) {
                for ( int j = 0; j < Columns; j++ ) {
                    pixels[ i, j ] = new Pixel( i, j );
                }
            }
 
            // Подгоняем размеры поля для отображения
            pictureBoxLED.Width = Rows * Pixel.Width;
            pictureBoxLED.Height = Columns * Pixel.Width;
        }
 
        private void PictureBoxLedPaint( object sender, PaintEventArgs e ) {
            // Перерисовываем пиксели
            for ( int i = 0; i < Rows; i++ ) {
                for ( int j = 0; j < Columns; j++ ) {
                    pixels[ i, j ].Draw( e.Graphics );
                }
            }
        }
 
        private void PictureBoxLedMouseClick( object sender, MouseEventArgs e ) {
            // Обновляем отмеченность пикселей
            for ( int i = 0; i < Rows; i++ ) {
                for ( int j = 0; j < Columns; j++ ) {
                    pixels[ i, j ].MouseClick( e );
                }
            }
 
            // Перерисовываем
            pictureBoxLED.Invalidate();
        }
 
        private void PictureBoxLedMouseMove( object sender, MouseEventArgs e ) {
            // Отмечаем при зажатой клавише
            if ( e.Button == MouseButtons.Left ||
                e.Button == MouseButtons.Right ) {
                PictureBoxLedMouseClick( sender, e );
            }
        }
    }
 
    public class Pixel {
        /// <summary>
        ///   Отображаемая ширина пикселя
        /// </summary>
        public const int Width = 6;
 
        /// <summary>
        ///   Ограничивающий прямоугольник
        /// </summary>
        private Rectangle boundingRectangle;
 
        /// <summary>
        ///   Пиксель по номеру строки и столбца
        /// </summary>
        /// <param name = "row">Строка</param>
        /// <param name = "columns">Столбец</param>
        public Pixel( int row, int columns ) {
            boundingRectangle = new Rectangle( row * Width, columns * Width, Width, Width );
        }
 
        /// <summary>
        ///   Номер строки и столбц пикселя
        /// </summary>
        public Point PixelLocation {
            get { return new Point( boundingRectangle.X / Width, boundingRectangle.Y / Width ); }
        }
 
        /// <summary>
        ///   Определяет, горит ли пиксел
        /// </summary>
        public bool IsChecked { get; private set; }
 
        /// <summary>
        ///   Отрисовка пикселя
        /// </summary>
        /// <param name = "g">Контекст для отрисовки</param>
        public void Draw( Graphics g ) {
            if ( IsChecked ) {
                g.FillRectangle( Brushes.Black, boundingRectangle );
            }
            else {
                g.DrawRectangle( Pens.LightGray, boundingRectangle );
            }
        }
 
        /// <summary>
        ///   Событие при клике мышью
        /// </summary>
        /// <param name = "e">Аргументы события клика</param>
        public void MouseClick( MouseEventArgs e ) {
            if ( boundingRectangle.Contains( e.Location ) ) {
                IsChecked = e.Button == MouseButtons.Left;
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы