Поскольку вы используете .NET 2.0, вам не будет доступен делегат Func
, но вы можете использовать делегат MethodInvoker .
Вы не сможете использовать синтаксис лямбда-выражений с .NET 2.0, но вы можете использовать синтаксис «анонимного делегата» (что почти так же), как показано в примере кода ниже.
Запрос данных в элементах управления пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом, обычно является редкостью; обычно элементы управления вашего пользовательского интерфейса инициируют события, которые выполняются в потоке пользовательского интерфейса, поэтому вы собираете нужные данные из элементов управления пользовательского интерфейса в то время, а затем передаете эти данные в какую-то другую функцию, поэтому вам не нужно беспокоиться о выполнении Invoke. .
В вашем случае, однако, вы должны быть в состоянии сделать что-то вроде этого:
public ApplicationViewModel SelectedApplication
{
get
{
if (this.InvokeRequired)
{
ApplicationViewModel value = null; // compiler requires that we initialize this variable
// the call to Invoke will block until the anonymous delegate has finished executing.
this.Invoke((MethodInvoker)delegate
{
// anonymous delegate executing on UI thread due calling the Invoke method
// assign the result to the value variable so that we can return it.
value = _applicationsCombobox.SelectedItem as ApplicationViewModel;
});
return value;
}
else
{
return _applicationsCombobox.SelectedItem as ApplicationViewModel;
}
}
}
РЕДАКТИРОВАТЬ: Теперь, когда я смотрю на ваш пример кода .NET 4.0, а также на функцию Invoke, я вижу, как она может возвращать значение (а не то, что у меня было причина использовать ранее).
Что ж, делегат MethodInvoker не ожидает возвращаемого значения, но, как указал @haiyyu, вы можете определить свой собственный делегат. Например, вам просто нужно определить свой собственный Func<TResult>
делегат, и оригинальный код, вероятно, будет работать нормально:
// this is all that is required to declare your own Func<TResult> delegate.
delegate TResult Func<TResult>();
Пример кода со страницы MSDN:
public partial class Form1 : Form
{
public Form1()
{
// Create a timer that will call the ShowTime method every second.
var timer = new System.Threading.Timer(ShowTime, null, 0, 1000);
}
private void ShowTime(object x)
{
// Don't do anything if the form's handle hasn't been created
// or the form has been disposed.
if (!this.IsHandleCreated && !this.IsDisposed) return;
// Invoke an anonymous method on the thread of the form.
this.Invoke((MethodInvoker) delegate
{
// Show the current time in the form's title bar.
this.Text = DateTime.Now.ToLongTimeString();
});
}
}