Ma.Kabiri Ответов: 1

Windows forms вводит состояние не отвечает


Привет. У меня есть глубокий вложенный цикл (около 30 глубин) в приложении windows form c#.
когда эта программа запускается, она переходит в состояние "не отвечает". Я запускаю это на 64-битной машине.

if (c22.Any())
                                                                                                                                                                                            {
                                                                                                                                                                                                for (int a22 = 0; a22 < c22.Count(); a22++)
                                                                                                                                                                                                {
                                                                                                                                                                                                    if (c23.Any())
                                                                                                                                                                                                    {
                                                                                                                                                                                                        for (int a23 = 0; a23 < c23.Count(); a23++)
                                                                                                                                                                                                        {
                                                                                                                                                                                                            if (c24.Any())
                                                                                                                                                                                                            {
                                                                                                                                                                                                                for (int a24 = 0; a24 < c24.Count(); a24++)
                                                                                                                                                                                                                {
                                                                                                                                                                                                                    if (c25.Any())
                                                                                                                                                                                                                    {
                                                                                                                                                                                                                        for (int a25 = 0; a25 < c25.Count(); a25++)
                                                                                                                                                                                                                        {
                                                                                                                                                                                                                            if (c26.Any())
                                                                                                                                                                                                                            {
                                                                                                                                                                                                                                for (int a26 = 0; a26 < c26.Count(); a26++)
                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                    if (c27.Any())
                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                        for (int a27 = 0; a27 < c27.Count(); a27++)
                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                            if (c28.Any())
                                                                                                                                                                                                                                            {
                                                                                                                                                                                                                                                for (int a28 = 0; a28 < c28.Count(); a28++)
                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                    if (c29.Any())
                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                        for (int a29 = 0; a8 < c29.Count(); a29++)
                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                            richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                + c21[a21] + "," + c22[a22] + "," + c23[a23] + "," + c24[a24] + "," + c25[a25] + "," + c26[a26] + "," + c27[a27] + "," + c28[a28] + "," + c29[a29] + "\n";
                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                    else
                                                                                                                                                                                                                                                        richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "," + c23[a23] + "," + c24[a24] + "," + c25[a25] + "," + c26[a26] + "," + c27[a27] + "," + c28[a28] + "\n";

                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                            else
                                                                                                                                                                                                                                                richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "," + c23[a23] + "," + c24[a24] + "," + c25[a25] + "," + c26[a26] + "," + c27[a27] + "\n";
                                                                                                                                                                                                                                        }

                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                    else
                                                                                                                                                                                                                                        richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "," + c23[a23] + "," + c24[a24] + "," + c25[a25] + "," + c26[a26] + "\n";
                                                                                                                                                                                                                                }
                                                                                                                                                                                                                            }
                                                                                                                                                                                                                            else
                                                                                                                                                                                                                                richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "," + c23[a23] + "," + c24[a24] + "," + c25[a25] + "\n";
                                                                                                                                                                                                                        }
                                                                                                                                                                                                                    }
                                                                                                                                                                                                                    else
                                                                                                                                                                                                                        richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "," + c23[a23] + "," + c24[a24] + "\n";
                                                                                                                                                                                                                }

                                                                                                                                                                                                            }
                                                                                                                                                                                                            else
                                                                                                                                                                                                                richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "," + c23[a23] + "\n";
                                                                                                                                                                                                        }
                                                                                                                                                                                                    }
                                                                                                                                                                                                    else
                                                                                                                                                                                                        richTextBox1.Text += c0[a0] + "," + c1[a1] + "," + c2[a2] + "," + c3[a3] + "," + c4[a4] + "," + c5[a5] + "," + c6[a6] + "," + c7[a7] + "," + c8[a8] + "," + c9[a9] + "," + c10[a10]
                                                                                                                                                                                                                                                                 + c11[a11] + "," + c12[a12] + "," + c13[a13] + "," + c14[a14] + "," + c15[a15] + "," + c16[a16] + "," + c17[a17] + "," + c18[a18] + "," + c19[a19] + "," + c20[a20]
                                                                                                                                                                                                                                                                 + c21[a21] + "," + c22[a22] + "\n";
                                                                                                                                                                                                }


Что я уже пробовал:

Если я запущу его в многопоточном режиме, текст richTextBox не будет истинным.

A_Griffin

Я думаю, это проблема с памятью. Но серьезно... вам нужно переосмыслить свой дизайн кода. Что бы вы ни пытались сделать здесь, есть лучший способ, я вам обещаю.

Ma.Kabiri

@A_Griffin, у меня есть 2d-массив[8*30], который содержит буквы алфавита.
Например, если входные данные {{a, b, c}, {d, e, f}, {g, h, i}}
Я хочу напечатать вывод следующим образом: abc,abf,abi,aec,aef,aei,ahc,ahf,ahi,dbc,dbf,... и т. д.

1 Ответов

Рейтинг:
1

OriginalGriff

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

Но, как вы уже заметили,вы можете получить доступ к элементам управления пользовательского интерфейса только из потока пользовательского интерфейса - если вы попытаетесь получить доступ к ним из другого потока, вы получите исключение перекрестного потока.

Есть два способа обойти это:
1) Используйте Invoke для перемещения связанного с элементом управления кода (и только этого кода) обратно в поток пользовательского интерфейса:
Контроль.Вызов Метода (Делегата) (System.Окна.Формы)[^]
2) Используйте поток, который позволяет вам "отчитываться" перед потоком пользовательского интерфейса и позволять ему обрабатывать элементы управления. То Класс BackgroundWorker (System.ComponentModel)[^] обеспечивает это с помощью отчета о ходе выполнения, который позволяет передавать объект-текст для добавления с помощью аргументов событий.

- Я? Я бы использовал BackgroundWorker.