以下网站显示了该功能的签名,但没有允许单个参数。 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提供更多重载时,我不知道这意味着什么。
答案 0 :(得分:1)
其中一个重载是BeginInvoke(Delegate, Object[])
。虽然这似乎需要两个参数,但当您查看docs for that method时,您会看到它实际上被定义为
public DispatcherOperation BeginInvoke(
Delegate method,
params object[] args
)
第二个参数使用params关键字,这意味着可以在Delegate参数之后传递任意数量的对象参数。零对象参数完全有效,并且会导致方法接收空数组。