当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();
}
}
那么如何做到这一点作为一个线程,得到参数?
正如已经建议的,你应该考虑在。net中以多种方式运行按钮任务之一(线程,线程池,任务等)。
然而,如果你正在寻找一个快速的解决方案,你可以尝试这些事情之一:
-
调用Application.DoEvents()允许UI处理窗口消息泵。例如
WindowState = FormWindowState.Minimized; Application.DoEvents();
-
异步调用最小化例如
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代替