Подтвердить что ты не робот

Синтаксис BeginInvoke диспетчера

Я пытаюсь следовать некоторым примерам служб данных WCF и иметь следующий код:

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

Вызывается следующим образом:

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

Теперь я немного запутался. Во-первых, первый бит кода показывает синтаксическую ошибку "Тип выражения lambda типа аргумента не присваивается типу параметра System.Delegate". Поэтому вместо того, чтобы слепо пытаться следовать примеру кода, я попытался понять, что здесь происходит. К сожалению, я изо всех сил пытаюсь понять ошибку и то, что на самом деле происходит.

Я чувствую себя немного глупо, так как я уверен, что это легко.

Заранее благодарим за любое просвещение!

4b9b3361

Ответ 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);