具有一个委托参数的BeginInvoke如何在WPF应用程序中编译?

时间:2016-03-30 23:34:59

标签: c# .net wpf

以下网站显示了该功能的签名,但没有允许单个参数。 https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.begininvoke(v=vs.110).aspx

以下网站显示了获取Action类型的silverlight声明,该类型似乎与示例程序正在执行的操作类似。然而,示例程序不是Silverlight,而是WPF应用程序。 https://msdn.microsoft.com/en-us/library/cc190259(v=vs.95).aspx

我正在尝试了解如何阅读文档以验证我对示例程序的理解。我无法弄清楚这个程序链接的具体功能是什么。以下是来自Windows Presentation Foundation 4.5 Cookbook一书的程序的功能。该调用与我在silverlight文档中看到的DispatcherInvoke版本相匹配,考虑到它不是一个silverlight应用程序似乎很奇怪,.net框架似乎没有提供该签名。除了在silverlight文档中,我应该能够找到正确描述函数签名的位置吗?

private void OnCalculate(object sender, RoutedEventArgs e) {
            try {
                int first = int.Parse(_from.Text), last = int.Parse(_to.Text);
                _calcButton.IsEnabled = false;
                _cancelButton.IsEnabled = true;
                _cts = new CancellationTokenSource();

                ThreadPool.QueueUserWorkItem(_ => {
                    int total = CountPrimes(first, last, _cts.Token);
                    Dispatcher.BeginInvoke(new Action(() => {
                        _result.Text = total < 0 ? "Cancelled!" : "Total Primes: " + total.ToString();
                        _cancelButton.IsEnabled = false;
                        _calcButton.IsEnabled = true;
                    }));
                });
            }
            catch(FormatException ex) {
                MessageBox.Show(ex.Message);
            }

        }

进一步阅读,本书确实提到WPF 4.5提供了更多的重载。虽然这有点帮助,但我仍然不明白Microsoft文档中描述的位置。一个后续问题是,WPF如何为最初在.Net中定义的事物提供重载?我认为Dispatcher类只是.net框架线程命名空间的一部分,所以当有人写WPF提供更多重载时,我不知道这意味着什么。

1 个答案:

答案 0 :(得分:1)

其中一个重载是BeginInvoke(Delegate, Object[])。虽然这似乎需要两个参数,但当您查看docs for that method时,您会看到它实际上被定义为

public DispatcherOperation BeginInvoke(
    Delegate method,
    params object[] args
)

第二个参数使用params关键字,这意味着可以在Delegate参数之后传递任意数量的对象参数。零对象参数完全有效,并且会导致方法接收空数组。