C# 调度员开始发号施令

C# 调度员开始发号施令,c#,wpf,C#,Wpf,关于Dispatcher.BeginInvoke的问题 如果我有如下方法: private void DoSomeWork() { MyCanvas.Dispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate { //Do something return null; }), n

关于Dispatcher.BeginInvoke的问题

如果我有如下方法:

private void DoSomeWork()
{
   MyCanvas.Dispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate
        {
            //Do something

            return null;

        }), null);
    }
我多次调用该方法,然后按照文档创建的顺序执行多个调用:如果在同一DispatcherPriority进行多个BeginInvoke调用,则将按照调用的顺序执行

如何清除此项以停止另一个呼叫或将队列重置为仅一个呼叫

如何清除此项以停止另一个呼叫或将队列重置为仅一个呼叫

你没有。您无法控制调度程序队列。您可以做的是保留“挂起的请求”的计数(当然,确保以原子方式更新它),并且仅在这是队列中的最后一个调用时执行(即,当减少计数时,给出0)

另一种选择是为最后一次呼叫的时间保留某种计时器,并在一段时间内忽略进一步的呼叫


如果您能提供更多关于您试图实现的目标的详细信息,我们可以提供更多具体的帮助。

您提供的MSDN链接更深入地为您提供了答案


此操作返回可用于取消的对象。但是,这是以每次呼叫为基础的,因为您无法完全控制队列。

您……不能。至少在概念上不是这样(在实践中是有办法的)。如果您想,您可能只需要使用
Invoke
而不是
BeginInvoke
,这样您就可以知道在执行每个操作时是否需要运行它。如果您知道dispatcher上会添加多个队列,那么首先您不应该多次调用该方法。一旦该方法被调用,设置一些变量或其他东西,并基于它,不要在dispatcher上对新项目进行排队。为什么要将项目排队给dispatcher,然后阻止它对已经排队的项目进行排队?我基本上使用的是一种股票报价器。我的“DoSomeWork”方法创建了ticker,调度程序检查ticker上的最后一个节点是否可见,并将第一个节点附加到它,等等。这很好,但我有一个过滤器,用户可以通过正/负移动进行过滤,当他们这样做时,我通过再次调用“DoSomeWork”并应用过滤器来重建ticker。这感觉很糟糕,因为我希望以某种方式清除调度员。不过,我可能需要去多读一点调度员的资料。