使用 WinForms,您可以使用它来允许 Application 调度事件并刷新 GUI,同时禁用表单以禁止用户交互并在需要时更改鼠标光标:
Cursor = Cursors.WaitCursor; // for UX
Enabled = false; // for UX
try
{
for ( int t = 0; t < MeasNoAvg; t++ )
{
tempList[t] = AveragePixeLink2();
Refresh();
Application.DoEvents(); // for UI
}
temp = tempList.Average();
}
finally
{
Enabled = true;
Cursor = Cursors.Default;
}
您还可以添加一个默认禁用的取消按钮,以允许使用条件变量停止进程。
在这种情况下,您可以通过使用例如SetFormEnabled() 方法(禁用面板禁用所有内部控件)来逐一禁用您希望用户不允许交互的所有控件。
private bool CancelRequired;
SetFormEnabled(false);
Cursor = Cursors.WaitCursor;
CancelRequired = false;
ButtonCancel.Enabled = true;
try
{
for ( int t = 0; t < MeasNoAvg; t++ )
{
if ( CancelRequired ) break;
tempList[t] = AveragePixeLink2();
Refresh();
Application.DoEvents();
}
temp = tempList.Average();
}
finally
{
CancelRequired = false;
ButtonCancel.Enabled = false;
Cursor = Cursors.Default;
SetFormEnabled(true);
}
private void ButtonCancel_Click(object sender, EventArgs e)
{
CancelRequired = true;
}
如果该过程需要时间,您可以使用表单上的进度条或 TopMost 为 true 的启动框中:
SplashForm.cs 或当前表单
public void InitProgress(int stepCount, int stepIncrement)
{
progressBar.Minimum = 0;
progressBar.Maximum = stepCount;
progressBar.Value = 0;
progressBar.Step = stepIncrement;
}
void DoProgress()
{
progressBar.PerformStep();
progressBar.Refresh();
}
来电表格
SetFormEnabled(false);
var splash = new SplashForm();
splash.InitProgress(MeasNoAvg, 1);
splash.Show();
CancelRequired = false;
ButtonCancel.Enabled = true;
Cursor = Cursors.WaitCursor;
try
{
for ( int t = 0; t < MeasNoAvg; t++ )
{
if ( CancelRequired ) break;
tempList[t] = AveragePixeLink2();
Refresh();
splash.DoProgress();
Application.DoEvents();
}
temp = tempList.Average();
}
finally
{
CancelRequired = false;
ButtonCancel.Enabled = false;
Cursor = Cursors.Default;
splash.Close();
SetFormEnabled(true);
}
如果进度条在主窗体中,去掉splash的使用,最后设置进度条值为0。