【问题标题】:WPF "DoEvents": how to implement it? [duplicate]WPF“DoEvents”:如何实现它? [复制]
【发布时间】:2014-11-07 10:13:47
【问题描述】:

我为“DoEvents”方法找到了这两个实现:

解决方案 1:

System.Windows.Application.Current.Dispatcher.Invoke(
       System.Windows.Threading.DispatcherPriority.Background,
       new System.Threading.ThreadStart(() => { }));

解决方案 2:

System.Windows.Application.Current.Dispatcher.Invoke(
       System.Windows.Threading.DispatcherPriority.Background,
       new System.Action(delegate { }));

您能解释一下这两种实现有什么区别,什么最适合使用?

谢谢。

【问题讨论】:

  • 你认为你为什么需要这个? DoEvents 在 WinForms 中也很丑陋。
  • 是的,我知道,但我遇到的情况是有一个正在运行的 BackgroundWorker,我应该暂停直到它“忙”。无论如何,我引用的两种实现有什么区别?
  • 没有实际区别,只是代表的类型。 IMO,解决方案 2 可读性更好。
  • 如果可以避免,请不要使用DoEvents 风格的方法(提示:您可以避免)。使用事件处理程序或某种延续机制(例如,async/await)来恢复执行。忙于等待只会增加您的 CPU 使用率。

标签: c# .net wpf dispatcher doevents


【解决方案1】:

除了语法之外,这两种解决方案没有区别。 ThreadStartAction 都是具有相同声明且名称不同的委托:

public delegate void ThreadStart();
public delegate void Action();

您也可以创建自己的委托,并以相同的方式使用,例如:

public delegate void MyOwnAction();
...
Application.Current.Dispatcher.Invoke(
    DispatcherPriority.Background, new MyOwnAction(() => { }));

您也可以使用特定方法而不是匿名方法:

private void Target()
{
    ...
}

Application.Current.Dispatcher.Invoke(
    DispatcherPriority.Background, new MyOwnAction(Target));

【讨论】:

    【解决方案2】:

    他们都是代表,当你的事件执行需要完成时,它会在你的条件满足时启动事件(例如,在执行到达和调度程序优先级背景到达的情况下) 它们只是您可以参考的两种不同的实现方式

    What is the difference between Delegate & Action in C#

    或msdn获取信息

    http://msdn.microsoft.com/en-us/library/system.threading.threadstart(v=vs.110).aspx

    http://msdn.microsoft.com/en-us/library/system.action(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2021-01-25
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      相关资源
      最近更新 更多