我在.net树视图中捕获双击事件时遇到问题。在click事件中,我有一点时间消耗逻辑(即数据库调用以更新UI的一部分)。因为这里的时间延迟,在双击的情况下我的第二次点击被忽略,因此,树视图预期的正常行为(即双击展开)不起作用。 我的点击事件如下。
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//database call
}
}
数据库调用可防止在系统双击时间设置为最快时触发双击。 我尝试在其中实现一个线程,但我的应用程序阻止我使用其中的任何其他线程。因此,请建议一种方法,我可以在不使用线程的情况下触发双击事件(或在双击时使节点扩展):(
提前谢谢你:)
答案 0 :(得分:2)
不要在主线程中做任何超过几毫秒的工作,已经有很多工作要做了。让它做那些请。
您可以在这里使用TPL ..
var uiContext = TaskScheduler.FromCurrentSynchronizationContext();
var task = Task.Factory.StartNew(() =>
{
//Your database call here, which will be run in threadpool thread
return resultFromDatabase;
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
task.ContinueWith(antecedent =>
{
var resultFromDatabase = antecedent.Result;//This runs in main thread
//Update UI
}, CancellationToken.None, TaskContinuationOptions.None, uiContext);
StartNew提供了许多重载,要知道为什么我选择了包含这么多参数的重载read it here,同样适用于ContinueWith。
答案 1 :(得分:0)
那么,理想情况下,数据库调用应该在另一个线程中进行。您应该考虑重构您的应用程序以使其成为可能。
可能的解决方法是在treeView_NodeMouseClick
中处理右键单击(或中键单击),这样仍然可以调用treeView_NodeMouseDoubleClick
左键双击。
答案 2 :(得分:0)
我怀疑你可以绕过这个而不用让另一个线程来完成繁重的工作。在您的情况下发生的事情是,可能是资源密集型的DB调用发生在事件处理程序中,该事件处理程序由事件调度程序线程执行,该事务处理程序线程负责处理GUI(包括对事件的响应)除了渲染之外。
理想的解决方案是使用后台工作程序让它完成繁重的工作。如果您需要执行一些GUI操作,那么您可以查看this以前的SO线程以获取更多信息。
话虽这么说,如果真的不能使用线程,那么你可以做的就是在数据库操作之前禁用你的控制并在之后重新启用它。这应该禁止用户通过该控件向您发送新事件,但是,应用程序很可能会在一段时间内无响应。