我如何在WPF中"DoEvents"?

Nib*_*Pig 6 vb.net wpf

我读过C#版本如下:

Application.Current.Dispatcher.Invoke(
          DispatcherPriority.Background,
          new Action(delegate { }));
Run Code Online (Sandbox Code Playgroud)

但是我无法弄清楚如何将空委托放入VB.NET,因为VB.NET似乎不支持匿名方法.想法?

编辑:可能是这个?

Application.Current.Dispatcher.Invoke(
  DispatcherPriority.Background,
  New Action(Sub()

             End Sub))
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 6

VB.NET确实支持匿名委托,但仅作为单语句函数.(Sub.NET 4中的VB10中添加了多语句匿名函数和匿名函数)

为了提供上下文,DoEvents旨在允许单线程环境在工作完成时更新UI并处理其他Windows消息.不应该有任何的好处调用DoEvents(或者,如你在这里做什么,这样间接地通过调度员执行"空"功能)从另一个线程,因为UI线程由企业自行更新.

但是,为了回答你的问题,最简单的选择是这样的:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
    New Action(Function() 7))
Run Code Online (Sandbox Code Playgroud)

但是,我再也看不出这会实现什么.

如果您正在寻找的只是如何在UI线程上执行代码(如Control.Invoke来自Windows窗体),那么Dispatcher.Invoke(这就是您正在使用的)是正确的,您只需将内联匿名方法转换为谨慎的功能,并将其作为代表传递.可能有一些你可以逃脱匿名离开.例如,如果你正在做的只是更新进度条,你可以这样做:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
    New Action(Function() progressBar.Value = 100))
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为所有赋值都返回存储在赋值左侧的值.但是,您不能像这样调用一个sub(除非SomeFunctionName返回值,否则以下内容不会编译):

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
    New Action(Function() SomeFunctionName(params)))
Run Code Online (Sandbox Code Playgroud)

换句话说,C#代码中的任何匿名委托都可以:

  • 不止一个陈述
  • 不返回值(意味着它只是对方法的单个调用,而不是函数)

然后,您必须为这些函数创建函数并将委托传递给这些函数,而不是像在C#中那样内联代码.

  • @SLC:只有在你正在做的事情发生在UI线程*上时才会出现这种情况.如果代码在另一个线程上执行,那么这不是必需的.**如果您正在执行的操作*正在UI线程上执行,并且需要花费足够长的时间来要求显式的UI更新,那么它应该被移动到另一个线程.** (3认同)