当button_click函数工作时,不能最小化窗口

本文关键字:不能 最小化 窗口 工作 button click 函数 | 更新日期: 2023-09-27 18:02:40

我用c#写了一个带有窗口的程序。

我有一个按钮,做一些事情(这并不重要到底是什么),它刷新窗口在他的循环(在button_click函数)(this.Invalidate(false);(我不用这个。刷新,因为我有一个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();
        }
    }

那么如何做到这一点作为一个线程,得到参数?

当button_click函数工作时,不能最小化窗口

正如已经建议的,你应该考虑在。net中以多种方式运行按钮任务之一(线程,线程池,任务等)。

然而,如果你正在寻找一个快速的解决方案,你可以尝试这些事情之一:

  1. 调用Application.DoEvents()允许UI处理窗口消息泵。例如

    WindowState = FormWindowState.Minimized;
    Application.DoEvents();
    
  2. 异步调用最小化例如

    if (InvokeRequired)
        BeginInvoke(
            new Action(() => WindowState = FormWindowState.Minimized)
        );
    

更好的方法是在另一个线程中运行按钮上的代码,这样当你按下按钮时它就不会阻塞UI。

编辑:代码样本从我的另一个答案:

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);
        }
    }
}));

也检查这个

Edit2:看到您的问题代码更新后,我会建议您使用BackgroundWorker代替