button_click功能正常工作时,不能最小化窗口

时间:2011-07-16 01:07:41

标签: c# winforms

我有一个用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();
        }
    }

那么如何做一个获得参数的线程?

2 个答案:

答案 0 :(得分:1)

正如已经建议的那样,你应该考虑在.NET(Thread,ThreadPool,Task等)中以多种方式运行按钮任务。

但是,如果您正在寻找快速解决方案,可以尝试以下方法之一:

  1. 调用Application.DoEvents()以允许UI处理窗口消息泵。 e.g。

    WindowState = FormWindowState.Minimized;
    Application.DoEvents();
    
  2. 异步调用最小化 e.g。

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

答案 1 :(得分:0)

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

修改other answer的代码示例:

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