Диспетчер BeginInvoke Синтаксис - PullRequest
42 голосов
/ 21 сентября 2010

Я пытался следовать некоторым примерам WCF Data Services и получил следующий код:

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

Который называется следующим:

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

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

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

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

Ответы [ 3 ]

94 голосов
/ 21 сентября 2010

Проблема в том, что компилятор не знает, в какой тип делегата вы пытаетесь преобразовать лямбда-выражение. Вы можете исправить это либо с помощью приведения, либо с помощью отдельной переменной:

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

или

private void OnSaveCompleted(IAsyncResult result)
{
    Action action = () =>
    {
        context.EndSaveChanges(result);
    };
    Dispatcher.BeginInvoke(action);
}
11 голосов
/ 15 сентября 2012

Ответ Джона Скита очень хорош, но есть и другие возможности.Я предпочитаю «начать вызывать новое действие», которое легко прочитать и запомнить для меня.

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 голосов
/ 25 апреля 2017

Если ваш метод не требует параметров, это самая короткая версия, которую я нашел:

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