分派器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);