加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#:在控件调用列表中获取委托队列

发布时间:2020-12-15 21:18:47 所属栏目:百科 来源:网络整理
导读:假设我在 BFS manner中采用树视图并添加一些节点,但也采用线程安全的方式. treeView.Invoke((MethodInvoker)delegate{treeView.Nodes.Add(someNode);}); 后来我想将一个节点添加到添加到treeView的其中一个节点(因为我的深度增加了一个).在添加第二层节点之
假设我在 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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读