我有一个标准的CheckBox,在CheckChanged事件中,我调用数据库来刷新结果集。但是,数据库调用可能需要大约一秒钟,这会导致复选框中绘制的勾号被延迟,这可能导致用户反复点击。你知道用户是什么样的!!
那么,无论如何,我可以在数据库调用之前进行勾选绘制???
提前致谢。
答案 0 :(得分:0)
首先,我建议您不要在UI线程上进行数据库调用。而是使用BackgroundWorker或者只是启动另一个线程。
但是,如果您只想控制用户再次单击该复选框,只需将控件设置为disabled并告诉用户通过光标等待:
public void CheckBox_CheckChanged(object sender, EventArgs e){
CheckBox.Enabled = false;
Cursor = Cursors.Wait;
//Long Running database operation
Cursor = Cursor.Default;
CheckBox.Enabled = true;
}
答案 1 :(得分:0)
不要在UI线程上执行慢速数据库调用。使用BackgroundWorker。
答案 2 :(得分:0)
正如其他人所提到的,您可以使用BackgroundWorker class。 另一种选择是使用Task Parallel Library:
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功能的好处。