wpf - 如何在 WPF 中获取 "DoEvents"?

标签 wpf vb.net

我读到C#版本如下:

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

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

编辑:可能是这个?

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

             End Sub))

最佳答案

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

为了提供上下文,DoEvents 旨在允许单线程环境在工作完成时更新 UI 并处理其他 Windows 消息。从另一个线程调用 DoEvents(或者,正如您在此处所做的那样,通过在调度程序上执行“null”函数间接执行此操作)应该没有任何好处,因为 UI 线程应该更新就其本身而言。

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

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
    New Action(Function() 7))

但是,我还是看不出这实际上会实现什么。

如果您要寻找的只是如何在 UI 线程上执行代码(例如 Windows 窗体中的 Control.Invoke),那么 Dispatcher.Invoke (这就是您正在使用的)是正确的,您只需将内联匿名方法转换为离散函数并将其作为委托(delegate)传递。也许有些事情你可以匿名留下来逃脱惩罚。例如,如果您所做的只是更新进度条,您可以这样做:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
    New Action(Function() progressBar.Value = 100))

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

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _
    New Action(Function() SomeFunctionName(params)))

换句话说,C# 代码中的任何匿名委托(delegate):

  • 有多个声明
  • 不返回值(这意味着它只是对方法的一次调用,而不是函数)

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

关于wpf - 如何在 WPF 中获取 "DoEvents"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2667370/

相关文章:

wpf - 处理 WPF 应用程序中所有异常的最佳实践是什么?

c# - .NET Framework 1.x 应用程序能否在仅装有 .NET 4.0 的 PC 上运行?

VB.NET:如何编写 If Not 表达式?

mysql - 循环在 Sub 中不断重复

mysql - 使用 vb.net 将数据库列存储到按钮上的数组

wpf - 在 DataGrid (MVVM) 中显示数据

c# - 禁用 wpf 窗口上的鼠标事件和放置在其上的用户控件

c# - 通用 View 模型编辑支持

c# - 在 Twitch 中使用 IRC-Client 时 WPF-App 无法使用 [C#]

vb.net - 在运行时编译和运行代码