我有一个用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();
}
}
那么如何做一个获得参数的线程?
答案 0 :(得分:1)
正如已经建议的那样,你应该考虑在.NET(Thread,ThreadPool,Task等)中以多种方式运行按钮任务。
但是,如果您正在寻找快速解决方案,可以尝试以下方法之一:
调用Application.DoEvents()以允许UI处理窗口消息泵。 e.g。
WindowState = FormWindowState.Minimized;
Application.DoEvents();
异步调用最小化 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。