misaqyrn9677 Ответов: 3

Отображение gif, когда он не отвечает на C#


Привет
У Меня Есть 2 Формы В Моем Проекте
В Форме 1 Запустите Этот Код
int i = 0;
private void Form1_Load(object sender, EventArgs e)
{
    Form2 F = new Form2();
    F.Show();
    while (true)
    {
        i++;
        textbox1.text = i.toString();
    }
}

В Форме 2 Есть Один Анимированный Gif От PictureBox
Но мой вопрос, когда не отвечает мое приложение, например, в то время как (правда)
Вторая форма ничего не отображает, но есть в form2 инструмента (pictureBox) и показывает один Gif

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

while (true) - это пример кода для того, чтобы не отвечать
Я Хочу Показать True PictureBox Когда Не Отвечаю

3 Ответов

Рейтинг:
2

Mehdi Gholam

Это плохой способ делать вещи, но если вы должны попробовать использовать Application.DoEvents() :

int i = 0;
private void Form1_Load(object sender, EventArgs e)
{
    Form2 F = new Form2();
    F.Show();
    while (true)
    {
        i++;
        textbox1.text = i.ToString();
        Application.DoEvents();
    }
}

В качестве альтернативы используйте Task :
int i = 0;
private void Form1_Load(object sender, EventArgs e)
{
    Form2 F = new Form2();
    F.Show();
    Task.Factory.StartNew( () =>
    {
        i++;
        textbox1.text = i.ToString();
    });
}


Рейтинг:
1

OriginalGriff

Нет, не будет.
На самом деле этот код полностью блокирует поток пользовательского интерфейса, потому что он ничего не может сделать, чтобы посмотреть на происходящее событие, потому что он полностью занят внутри вашего приложения. while цикл-и так как он никогда не заканчивается,больше никакие события никогда не действуют.
Windows-это операционная система, основанная на сообщениях , и все, что вы (или пользователь) делаете, переводится в сообщение, которое передается по системе и обрабатывается "скрытой" частью вашего кода, называемой "циклом сообщений". Если вы не существуете из обработчика событий, то элемент управления никогда не возвращается в цикл сообщений и никогда не просматривает дальнейшие сообщения - так что ваш пользовательский интерфейс зависает и никогда не восстанавливается.
То, что вы делаете внутри этого цикла, все равно ничего не отобразит, даже без дополнительной формы по тем же самым причинам.

Вероятно, вам нужно посмотреть на запуск второго потока, чтобы что - то сделать (если этот код не является заполнителем для ваших реальных действий), но если вы это сделаете, вам нужно быть очень осторожным, так как вы не можете получить доступ к элементам управления, если они не находятся в основном потоке. Это становится сложным, и я не собираюсь пытаться объяснить это вам для этого кода!

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


Рейтинг:
0

Salman622

если вы делаете огромную работу в одном потоке, а также хотите отобразить другие вещи, это будет невозможно до тех пор, пока выполнение вашего кода не будет завершено

для этого вы можете использовать приведенную ниже идею.
Вы можете использовать background worker для выполнения своей не отвечающей работы
в то время как поток вашего приложения будет отображать поле gif-изображения
вот и все