Dispatcher BeginInvoke语法

时间:2010-09-21 13:31:11

标签: c# .net multithreading wcf-data-services

我一直在尝试关注一些WCF数据服务示例,并提供以下代码:

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

以下称为:

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

现在我在这里感到有些困惑。首先,第一位代码显示语法错误“参数类型lambda表达式不能分配给参数类型System.Delegate”。因此,我没有盲目地尝试遵循示例代码,而是试图了解这里发生了什么。不幸的是,我正在努力理解错误以及实际发生的事情。

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

提前感谢任何启蒙!

3 个答案:

答案 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);