не может свернуть окно, пока работает функция button_click - PullRequest
0 голосов
/ 16 июля 2011

У меня есть программа, которую я написал на C # с окном.

У меня есть кнопка, которая делает некоторые вещи (не важно, что именно), и она обновляет окно в своем цикле (в функции button_click) (with this.Invalidate (false); (я не использую this.Refresh, потому что у меня есть groupBox, который я не хочу обновлять)).

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

** Допустим, у меня есть этот код:

    void button_click(object sender, EventArgs e)
    {
        progressBar1.Value = 0;
        progressBar1.Maximum = int.Parse(somelabel_num.Text);
        int i;
        OpenFileDialog file = new OpenFileDialog();
        file.ShowDialog();
        if (file.FileName == "")
            return;
        this.Refresh();
        Bitmap image = new Bitmap(file.FileName);
        groupBox1.BackgroundImage = image;

        for (i = 0; i < int.Parse(somelabel_num.Text); i++)
        {
            this.Text = i;
            this.Invalidate(false);
            progressBar1.PerformStep();
        }
    }

так как сделать это как поток, который получает параметры?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Как уже предлагалось, вы должны рассмотреть возможность запуска задачи кнопки одним из многих способов, которые вы можете в .NET (Thread, ThreadPool, Task и т. Д.).

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

  1. Вызовите Application.DoEvents (), чтобы позволить пользовательскому интерфейсу обрабатывать насос сообщений окна. например,

    WindowState = FormWindowState.Minimized;
    Application.DoEvents();
    
  2. Минимизация вызовов асинхронно например,

    if (InvokeRequired)
        BeginInvoke(
            new Action(() => WindowState = FormWindowState.Minimized)
        );
    
0 голосов
/ 16 июля 2011

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

Редактировать: Пример кода из моего другой ответ :

private readonly object _userActivityLocker = new object();

private void button1_Click(object sender, EventArgs e)
{
    new Thread(delegate()
    {
    if (System.Threading.Monitor.TryEnter(_userActivityLocker))
    {
        //note that any sub clicks will be ignored while we are here
        try
        {
            //here execute your long running operation without blocking the UI
        }
        finally
        {
            System.Threading.Monitor.Exit(_userActivityLocker);
        }
    }
    }) { IsBackground = true }.Start();
}

Редактировать: Вы заявили в комментарии, что

исключение происходит, когда код достигает вызова openFileDialog).Я получаю это исключение: System.Threading.ThreadStateException

Вам необходимо вызвать код OpenFileDialog в основном потоке формы.поэтому внутри блока try:

this.Invoke(new Action(() =>
{
    using (OpenFileDialog dialog = new OpenFileDialog())
    {
        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            Console.WriteLine(dialog.FileName);
        }
    }
}));

Также проверьте this .

Edit2: После просмотра обновленного кода вопроса я сообщу вамиспользовать BackgroundWorker вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...