分派器BeginInvoke语法

我一直试图遵循一些WCF数据服务的例子,并有以下代码:

private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke(() => { context.EndSaveChanges(result); }); } 

这被称为以下:

 this.context.BeginSaveChanges(SaveChangesOptions.Batch, this.OnSaveCompleted, null); 

现在我在这里有点困惑。 首先,第一位代码显示“参数typeslambdaexpression式不能分配给参数typesSystem.Delegate”的语法错误。 所以不是盲目地试图遵循示例代码,而是尝试了解这里发生了什么。 不幸的是,我正在努力理解错误加上实际发生的事情。

我确信这很容易,我觉得有点愚蠢。

提前感谢任何启示!

问题是编译器不知道你试图把lambdaexpression式转换成什么样的委托。 您可以通过强制转换或单独的variables来解决这个问题:

 private void OnSaveCompleted(IAsyncResult result) { Dispatcher.BeginInvoke((Action) (() => { context.EndSaveChanges(result); })); } 

要么

 private void OnSaveCompleted(IAsyncResult result) { Action action = () => { context.EndSaveChanges(result); }; Dispatcher.BeginInvoke(action); } 

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))); } 

如果你的方法不需要参数,这是我发现的最短版本:

 Application.Current.Dispatcher.BeginInvoke((Action)MethodName);