C # InvokeRequired с помощью свойства getter - PullRequest
2 голосов
/ 04 августа 2011

Я бы хотел, чтобы мой поток получателя был безопасным. Когда я это делаю, я получаю сообщение об ошибке:

public ApplicationViewModel SelectedApplication
    {
        get
        {
            if (InvokeRequired)
            {
                BeginInvoke((Action<ApplicationViewModel>)SelectedApplication);
            }

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }

У меня ошибка:

Cannot cast expression of type 'Foo.Model.ApplicationViewModel' to type 'Action<ApplicationViewModel>'

Ответы [ 3 ]

6 голосов
/ 04 августа 2011

Много неправильного:

  • вы не можете использовать BeginInvoke, Invoke требуется
  • вы не можете использовать действие <>, вы возвращаете значение, поэтому Func<> требуется
  • Вы также не можете запустить исходный код после вызова, else требуется.

Который производит:

public ApplicationViewModel SelectedApplication
{
    get
    {
        if (this.InvokeRequired)
            return (ApplicationViewModel)this.Invoke(new Func<ApplicationViewModel>(() => this.SelectedApplication));
        else
            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
    }
}

Скрытие переключателей контекста потока в низкоуровневом свойстве обычно является ошибкой. У вызова есть много накладных расходов, в результате код может оказаться очень медленным, без намека на то, почему это так медленно.

3 голосов
/ 04 августа 2011

BeginInvoke принимает делегата.

Вы можете написать

return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem));
2 голосов
/ 04 августа 2011

Попробуйте:

public ApplicationViewModel SelectedApplication
    {
        get
        {
            if (InvokeRequired)
            {
                BeginInvoke(() => { return SelectedApplication(); });
            }

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }
...