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;
}
}