C# InvokeRequired с помощью свойства getter

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

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 ответа

Решение

Много чего не так:

  • вы не можете использовать 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;
    }
}

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

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

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

return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem));

Пытаться:

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

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }
Другие вопросы по тегам