Вызывать без Func в Гетере Собственности для .Net 2.0 - PullRequest
0 голосов
/ 22 февраля 2012

Я хотел бы использовать Invoke в геттере, как это сделать при использовании .Net 2.0, а не, например, 4.0?Для .Net> 2.0 мы можем использовать Func и чем заменить .Net 2.0?

Вот пример для .Net 4.0 (из ссылка )

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

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Поскольку вы используете .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();
        });
    }
}
1 голос
/ 22 февраля 2012

Используйте делегаты, они являются своего рода указателями на типизированные функции.Вот еще чтение: http://msdn.microsoft.com/en-us/library/ms173171%28v=vs.80%29.aspx

...