ShowDialog 跟 vs 有什么关系吗?为什么在在vs打开时,模式窗口关闭后,焦点转到vs上面?
在主线程中,用 ShowDialog 阻塞线程并显示进度条,然后等 BackgroundWorker 线程完成工作后再关闭进度条窗口,很简单的逻辑,理解不了,为什么进度条窗口关闭后,焦点会转给 vs2005?(如果vs最小化,就不会发生)
static public void DoWork(Work workMethod)
{
//
// 不带参数的工作方法
//
_workMethod = workMethod; // 保存委托到全局变量。
//
// 带参数的工作方法
//
_parameterizedWorkMethod = null; // 设置委托变量为空值,避免被调用。
DoWorkMethod(null);
}
static public object DoWork(ParameterizedWork workMethod, object parameter)
{
//
// 不带参数的工作方法
//
_workMethod = null; // 设置委托变量为空值,避免被调用。
//
// 带参数的工作方法
//
_parameterizedWorkMethod = workMethod; // 保存委托到全局变量。
return DoWorkMethod(parameter);
}
static private object DoWorkMethod(object parameter)
{
//
// 注意,DoWorkMethod 不能叫 DoWork,数字签名与 DoWork(Work workMethod) 重合。
//
if (waitingForm == null)
{
//
// 主窗口失去焦点与 Hide 方法没有关系,与VS有问题。(参考 CloseForm 方法中的注释)
//
waitingForm = new WaitingForm();
}
//
// DoWork 只能由界面主线程调用,不支持多线程并发。
//
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
//
// 开始异步工作
//
worker.RunWorkerAsync(parameter);
waitingForm.ShowDialog();
if (error != null)
{
//
// 由主线程抛出异常
//
throw error;
}
//
// 加载成功,返回结果。
//
return result;
}
static void worker_DoWork(object sender, DoWorkEventArgs e)
{
if (_workMethod != null)
{
//
// 调用“不带参数的工作方法”
//
_workMethod();
}
else
{
//
// 调用“带参数的工作方法”,完成数据加载,并保存返回结果。
//
result = _parameterizedWorkMethod(e.Argument);
}
}
static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
//
// 将异常转递给主线程,由主线程抛出。
//
error = e.Error;
}
else
{
//
// 由于是静态变量,所以没有出错时,要设置为空,避免被抛出。
//
error = null;
}
//
// 关闭登录窗口
//
CloseForm();
}
static private void CloseForm()
{
if (waitingForm.InvokeRequired)
{
waitingForm.BeginInvoke(new MethodInvoker(CloseForm));
}
else
{
waitingForm.Hide(); // 这句执行以后,主窗口的焦点奇怪消失,转给了VS(不知道跟VS2005有毛关系?如果VS是最小化的,就不会发生)
}
}