当. net树视图的单击事件中有一个很长的逻辑时,忽略双击

本文关键字:双击 有一个 视图 net 单击 事件 | 更新日期: 2023-09-27 18:06:26

我在。net树视图中捕获双击事件时遇到了麻烦。在点击事件中,我有一点耗时的逻辑(即数据库调用更新UI的一部分)。因此,由于这里的时间延迟,我的第二次点击在双击的情况下被忽略,因此,正常的行为预期从一个树视图(即展开双击)不工作。我的点击事件如下。

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{ 
 if (e.Button == MouseButtons.Left)
{
//database call
}
}

当系统双击时间设置为最快时,数据库调用阻止触发双击。我试图实现一个线程内,但我的应用程序阻止我使用任何其他线程内。因此,请建议一种方法,在不使用线程的情况下,我可以触发双击事件(或让节点在双击时展开):(

提前感谢:)

当. net树视图的单击事件中有一个很长的逻辑时,忽略双击

不要在主线程中做任何超过几毫秒的工作,它已经有很多工作要做了。请让它做这些。

你可以在这里使用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提供了许多重载,要知道为什么我选择了一个有这么多参数的重载,你可以在这里阅读它,同样适用于ContinueWith

理想情况下,数据库调用应该在另一个线程中进行。你应该考虑重构你的应用程序,使之成为可能。

一个可能的解决方法是在treeView_NodeMouseClick中处理右键单击(或单击中键),以便treeView_NodeMouseDoubleClick仍然调用左键双击。

我怀疑如果没有另一个线程来完成繁重的工作,您是否可以绕过这个。在你的情况下发生的是DB调用,这可能是资源密集型的,发生在你的事件处理程序中,它是由事件调度线程执行的,这是负责GUI的代码(包括对事件的响应,而不仅仅是呈现)。

理想的解决方案是使用后台工作器,让它完成繁重的工作。如果您需要执行一些GUI操作,那么您可以查看前面的SO线程以获取更多信息。 也就是说,如果你真的不能使用线程,你能做的就是在DB操作之前禁用你的控件,然后重新启用它。这将禁止用户通过该控件向您发送新事件,但也就是说,应用程序很可能会在一段时间内变得无响应。
相关文章: