程序原来的代码
//用BackgroundWorker实现显示progress进度条
protected static void ShowProgress(frmBase parent)
{
m_bShowProgress = true;
m_this = parent;
if (worker == null)
{
worker = new BackgroundWorker();
worker.DoWork+=new DoWorkEventHandler(worker_DoWork);
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = false;
worker.RunWorkerAsync();
}
}
//不显示进度条
protected static void CloseProgress()
{
m_bShowProgress = false;
}
//BackgroundWorker开始执行代码
<span style="white-space:pre"> </span>protected static void worker_DoWork(object sender, EventArgs e)
{
while (true)
{
if (m_bShowProgress)
{
m_frmProgress.Left = m_this.Left + (m_this.Width - m_frmProgress.Width) / 2;
m_frmProgress.Top = m_this.Top + (m_this.Height - m_frmProgress.Height) / 2;
m_frmProgress.Show();
m_frmProgress.Refresh();
}
else
{
m_frmProgress.Visible = false();
}
Thread.Sleep(50);
}
}
上边的代码在运行时,如果按 ctrl+space 切换输入法会导致整个程序无响应,子线程创建的窗体在不需要显示时,要用Close()关闭,不要用Visible = false.
将ackgroundWorker开始执行代码 修改为:
protected static void worker_DoWork(object sender, EventArgs e)
{
while (true)
{
if (m_bShowProgress)
{
if (m_frmProgress == null || m_frmProgress.IsDisposed)
{
m_frmProgress = new frmProgress();
}
m_frmProgress.Left = m_this.Left + (m_this.Width - m_frmProgress.Width) / 2;
m_frmProgress.Top = m_this.Top + (m_this.Height - m_frmProgress.Height) / 2;
m_frmProgress.Show();
m_frmProgress.Refresh();
}
else
{
m_frmProgress.Close();
}
Thread.Sleep(50);
}
}