我一直在尝试关注一些WCF数据服务示例,并提供以下代码:
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke(() =>
{
context.EndSaveChanges(result);
});
}
以下称为:
this.context.BeginSaveChanges(SaveChangesOptions.Batch, this.OnSaveCompleted, null);
现在我在这里感到有些困惑。首先,第一位代码显示语法错误“参数类型lambda表达式不能分配给参数类型System.Delegate”。因此,我没有盲目地尝试遵循示例代码,而是试图了解这里发生了什么。不幸的是,我正在努力理解错误以及实际发生的事情。
我觉得有点愚蠢,因为我确信这很容易。
提前感谢任何启蒙!
答案 0 :(得分:93)
问题是编译器不知道您尝试将lambda表达式转换为什么类型的委托。您可以使用强制转换或单独的变量来修复它:
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke((Action) (() =>
{
context.EndSaveChanges(result);
}));
}
或
private void OnSaveCompleted(IAsyncResult result)
{
Action action = () =>
{
context.EndSaveChanges(result);
};
Dispatcher.BeginInvoke(action);
}
答案 1 :(得分:11)
Jon Skeet的回答非常好,但还有其他可能性。我更喜欢“开始调用新动作”,这对我来说很容易阅读和记忆。
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke(new Action(() =>
{
context.EndSaveChanges(result);
}));
}
或
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke(new Action(delegate
{
context.EndSaveChanges(result);
}));
}
或
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke(new Action(() => context.EndSaveChanges(result)));
}
答案 2 :(得分:3)
如果您的方法不需要参数,这是我找到的最短版本:
Application.Current.Dispatcher.BeginInvoke((Action)MethodName);