Приложение формы Windows C# заблокировано во время выполнения

Я новичок в C#, и у меня есть проблема... когда я запускаю приложение Windows Form и нажимаю кнопку запуска, во время выполнения я ничего не могу сделать с формой (закрыть, свернуть, переместить,...), но когда это сделано, я могу закрыть форму.
Что я должен сделать, чтобы решить это?

using System;
using System.Threading;
using System.Windows.Forms;


namespace WindowsFormsApplication10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        private void c1Button1_Click(object sender, EventArgs e)
        {
            for ( int i = 0; i < 100; i++)
            {

                c1RadialGauge1.Value = i;
                textBox1.Text = i.ToString();
                textBox1.Update();
                c1Gauge1.Refresh();
                Thread.Sleep(100);

            }

        }
    }
}

1 ответ

Решение

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

Одним из решений этого было бы сделать обработчик async и использовать await Task.Delay() Вместо того, чтобы использовать Thread.Sleep():

private async void c1Button1_Click(object sender, EventArgs e)
{
    c1Button1.Enabled = false; // avoid multiple clicks
    for ( int i = 0; i < 100; i++)
    {
        c1RadialGauge1.Value = i;
        textBox1.Text = i.ToString();
        textBox1.Update();
        c1Gauge1.Refresh();
        await Task.Delay(100);
    }
    c1Button1.Enabled = true; // allow further clicks
}

Компилятор переводит этот код в конечный автомат. На await Ключевое слово, поток управления возвращается вызывающей стороне (UI) и возобновляется, когда Task.Delay() закончил Так что пока Task.Delay() работает, поток пользовательского интерфейса успевает реагировать на другие события (например, взаимодействие с пользователем).

Я добавил две строки, чтобы отключить кнопку во время работы, чтобы пользователь не мог запустить ее несколько раз.

Но это возможно только при использовании.NET 4.5 или новее. Прочитайте это для получения дополнительной информации о async/await,

Если вам нужно использовать более старую платформу.NET, вы можете использовать BackgroundWorker вместо.

Другие вопросы по тегам