我有一个标准 CheckBox 并在 CheckChanged 事件中调用数据库以刷新其他位置的结果集。然而,数据库调用可能需要大约一秒钟,这会导致在复选框中绘制的刻度被延迟,这可能会导致用户一次又一次地单击。你知道用户是什么样的!!
那么,无论如何我可以在调用数据库之前进行刻度线吗???
提前致谢。
首先,我建议您不要在 UI 线程上进行数据库调用。而是使用 BackgroundWorker或只是启动另一个线程。
但是,如果您只想控制用户再次单击复选框,只需将控件设置为禁用并通过光标告诉用户等待:
public void CheckBox_CheckChanged(object sender, EventArgs e){
CheckBox.Enabled = false;
Cursor = Cursors.Wait;
//Long Running database operation
Cursor = Cursor.Default;
CheckBox.Enabled = true;
}
不要在 UI 线程上执行缓慢的数据库调用。使用BackgroundWorker。
正如其他人所提到的,您可以使用BackgroundWorker 类。另一种选择是使用任务并行库:
private void CheckBox_CheckChanged(object sender, EventArgs e)
{
Task.Factory.StartNew<MyResultData>(DoLongOperation)
.ContinueWith(UpdateUI, TaskScheduler.FromCurrentSynchronizationContext());
}
private MyResultData DoLongOperation()
{
// Long operation
// Return result to be used to update the UI
return new MyResultData();
}
private void UpdateUI(Task<MyResultData> task)
{
// Get the result of the task
MyResultData data = task.Result;
// Update the UI using the data
}
使用任务,当/如果您将来将代码定位到 .NET 4.5 时,您还将获得能够使用新的 async-await 功能的好处。