C# 如果SelectionChanged事件触发过快,是否会引发WPF Treeview stackoverflow?

C# 如果SelectionChanged事件触发过快,是否会引发WPF Treeview stackoverflow?,c#,wpf,treeview,stack-overflow,C#,Wpf,Treeview,Stack Overflow,我有一个包含1000项的TreeView。当我选择一个项目时,TreeView会触发一个事件,以便我可以更新GUI中的某些内容。事件处理程序是非递归的,没有循环,但它确实需要一点时间来完成,可能需要100毫秒 如果我选择顶部项目并使用向下箭头缓慢滚动项目,一切正常,但如果我按住箭头键,事件触发太快,我会得到stackoverflow异常 我想在TreeView中设置一个计时器,这样SelectionChanged事件只能每隔100毫秒左右触发一次,但这似乎很不正常。有没有办法解决这个问题 我在w

我有一个包含1000项的
TreeView
。当我选择一个项目时,
TreeView
会触发一个事件,以便我可以更新GUI中的某些内容。事件处理程序是非递归的,没有循环,但它确实需要一点时间来完成,可能需要100毫秒

如果我选择顶部项目并使用向下箭头缓慢滚动项目,一切正常,但如果我按住箭头键,事件触发太快,我会得到stackoverflow异常


我想在
TreeView
中设置一个计时器,这样
SelectionChanged
事件只能每隔100毫秒左右触发一次,但这似乎很不正常。有没有办法解决这个问题

我在winforms上也见过类似的事情。我看到人们实现的一种方法是使用延迟事件处理程序。使其仅在选定所述项目一段指定时间后激发

因此,工作的方式是您有一个执行计时器的事件处理程序。每当触发selectionchanged事件时,计时器就会重置。您的计时器可能为500毫秒,因此,如果500毫秒后仍选择选定值,则会触发您需要处理的实际事件代码


并不是说这是最好的方式,只是我在windows窗体中看到的一种处理方式。

我在winforms上也看到过类似的情况。我看到人们实现的一种方法是使用延迟事件处理程序。使其仅在选定所述项目一段指定时间后激发

因此,工作的方式是您有一个执行计时器的事件处理程序。每当触发selectionchanged事件时,计时器就会重置。您的计时器可能为500毫秒,因此,如果500毫秒后仍选择选定值,则会触发您需要处理的实际事件代码


并不是说这是最好的方式,只是我在windows窗体中看到的处理方式。

异步运行事件处理程序。最简单的方法如下:

void SelectionEventHandler(object sender, EventArgs e)
{
    var ownerElement = sender as FrameworkElement; // this should be the TreeView itself
    ThreadPool.QueueUserWorkItem(o => {

        // Do stuff 

        ownerElement.Dispatcher.BeginInvoke(new Action(() => {

            // Update UI in response to stuff being done

        });
    });
}
如果您使用类似的工具,那么您可以大大减少线程池等所涉及的问题

您也可以考虑并行任务库与它的代码>任务<代码>类——您可以通过下载反应框架来获得.NET 3.5版本。


注意:异步运行处理程序应该可以阻止堆栈溢出,但是当用户向下滚动列表时,它不会阻止处理程序运行1000次。如果您想这样做,您可以实现一个延迟计时器,或者如果您使用的是反应式框架,它有一些功能可以为您完成这类工作。

异步运行事件处理程序。最简单的方法如下:

void SelectionEventHandler(object sender, EventArgs e)
{
    var ownerElement = sender as FrameworkElement; // this should be the TreeView itself
    ThreadPool.QueueUserWorkItem(o => {

        // Do stuff 

        ownerElement.Dispatcher.BeginInvoke(new Action(() => {

            // Update UI in response to stuff being done

        });
    });
}
如果您使用类似的工具,那么您可以大大减少线程池等所涉及的问题

您也可以考虑并行任务库与它的代码>任务<代码>类——您可以通过下载反应框架来获得.NET 3.5版本。


注意:异步运行处理程序应该可以阻止堆栈溢出,但是当用户向下滚动列表时,它不会阻止处理程序运行1000次。如果你想这样做,你可以实现一个延迟计时器,或者如果你使用的是反应式框架,它有一些功能可以为你做这类事情。

当用户快速滚动列表时,你真的需要更新UI中的某些内容吗?当用户快速滚动列表时,可能不需要更新,但我如何判断他们是否快速滚动?当用户快速滚动列表时,您真的需要更新UI中的某些内容吗?可能不是在他们快速滚动时,但我如何判断他们是否快速滚动?