Синтаксис BeginInvoke диспетчера
Я пытаюсь следовать некоторым примерам служб данных WCF и иметь следующий код:
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke(() =>
{
context.EndSaveChanges(result);
});
}
Вызывается следующим образом:
this.context.BeginSaveChanges(SaveChangesOptions.Batch, this.OnSaveCompleted, null);
Теперь я немного запутался. Во-первых, первый бит кода показывает синтаксическую ошибку "Тип выражения lambda типа аргумента не присваивается типу параметра System.Delegate". Поэтому вместо того, чтобы слепо пытаться следовать примеру кода, я попытался понять, что здесь происходит. К сожалению, я изо всех сил пытаюсь понять ошибку и то, что на самом деле происходит.
Я чувствую себя немного глупо, так как я уверен, что это легко.
Заранее благодарим за любое просвещение!
Ответы
Ответ 1
Проблема заключается в том, что компилятор не знает, какого делегата вы пытаетесь преобразовать лямбда-выражение в. Вы можете исправить это либо литой, либо отдельной переменной:
private void OnSaveCompleted(IAsyncResult result)
{
Dispatcher.BeginInvoke((Action) (() =>
{
context.EndSaveChanges(result);
}));
}
или
private void OnSaveCompleted(IAsyncResult result)
{
Action action = () =>
{
context.EndSaveChanges(result);
};
Dispatcher.BeginInvoke(action);
}
Ответ 2
Ответа на этот вопрос Jon Skeet очень хорошо, но есть другие возможности. Я предпочитаю "begin invoke new action", который легко читать и запоминать для меня.
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)));
}
Ответ 3
Если ваш метод не требует параметров, это кратчайшая версия, которую я нашел:
Application.Current.Dispatcher.BeginInvoke((Action)MethodName);