0

我有一个标准 CheckBox 并在 CheckChanged 事件中调用数据库以刷新其他位置的结果集。然而,数据库调用可能需要大约一秒钟,这会导致在复选框中绘制的刻度被延迟,这可能会导致用户一次又一次地单击。你知道用户是什么样的!!

那么,无论如何我可以在调用数据库之前进行刻度线吗???

提前致谢。

4

3 回答 3

0

首先,我建议您不要在 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;
}
于 2012-08-03T10:56:50.273 回答
0

不要在 UI 线程上执行缓慢的数据库调用。使用BackgroundWorker

于 2012-08-03T10:58:05.173 回答
0

正如其他人所提到的,您可以使用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 功能的好处。

于 2012-08-03T11:25:35.573 回答