Создание массива занимает много времени - 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;
}
}
}
}