c#:在控件调用列表中获取委托队列
假设我在
BFS manner中采用树视图并添加一些节点,但也采用线程安全的方式.
treeView.Invoke((MethodInvoker)delegate{treeView.Nodes.Add(someNode);}); 后来我想将一个节点添加到添加到treeView的其中一个节点(因为我的深度增加了一个).在添加第二层节点之前,我怎么知道treeView已经添加了一个节点的所有深度.顺便说一下,第二级的信息取决于第一级.所有这些只是我需要的一个例子,但它是次要的现实问题. 也许某人扩展了一个节点,我想首先向该节点添加节点……在这种情况下,我想要中断treeView的调用列表,并开始在扩展的节点上添加节点. 我该怎么做这些任务呢? 我想我可以先深度添加节点,但我不想这样做.有没有更好的办法? 我真的很讨厌消息/委托队列正在形成的想法,我无法控制它. 解决方法
代表们如何在引擎盖下排队
实际的委托存储在一个名为threadCallbackList的私有字段中的队列中,该字段位于控件或最近的父控件上,该控件的句柄已经创建.数据结构只是一个System.Collections.Queue. 知道TreeView已经拥有了所有深度 – 添加了一个节点 如果要与主线程进行通信,节点已经填充了所有子节点,则可以在节点的Tag属性中存储某些内容(枚举)以指示该节点. 如果您认为需要与后台线程进行通信,那么将最终节点添加到树视图级别的委托已经运行,则不会.您使用BeginInvoke和Invoke提交的代理将按顺序执行. 中断BeginInvoked委托的执行 您无法通过单击同一线程上的控件来中断UI线程上排队委托的执行.委托执行就像程序的任何其他部分一样.它是一个循环,使每个代理出列并执行它们.你的UI线程将执行这些委托,因此它也不能执行试图中断排队委托执行的click事件处理程序.即使您可以弄清楚如何使用反射来排除排队的委托,您也不可能在其他代码在同一个线程中运行的同时执行此操作. 可能解决方案 听起来你只是担心淹没你的UI线程.如果是这种情况,您可以通过每N次调用调用Invoke而不是BeginInvoke来限制后台线程.这将导致后台工作线程等待直到刷新队列(至少直到该调用中传递的委托).这样你一次就不会有超过N个排队的代表.如果你走了那条路,你可以每次只调用并使用AddRange(someNodes)而不是Add(someNode). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |