Winforms - какой самый простой способ обновить свойство потокобезопасным способом - PullRequest
4 голосов
/ 15 февраля 2012

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

Это мое свойство set в поточно-ориентированном коде.

public static void SetPropertyThreadSafe(this TControl self, Action setter)
    where TControl : Control
{
    if (self.InvokeRequired)
    {
        var invoker = (Action)(() => setter(self));
        self.Invoke(invoker);
    }
    else
    {
        setter(self);
    }
}

Что вызывается следующим образом:

this.lblNameField.SetPropertyThreadSafe(p => p.Text = "Name:");

Это моя попытка получить свойство в поточно-ориентированном коде.

public static TResult GetPropertyThreadSafe(this TControl self, Func getter)
    where TControl : Control
{
    if (self.InvokeRequired)
    {
        var invoker = (Func)((TControl control) => getter(self));
        return (TResult)self.Invoke(invoker);
    }
    else
    {
        return getter(self);
    }
}

Это не работает. Надеюсь, я хотел бы позвонить, выполнив следующее:

string name = this.lblNameField.GetPropertyThreadSafe(p => p.Text);

1 Ответ

3 голосов
/ 15 февраля 2012

Вы должны быть в состоянии использовать:

public static TResult GetPropertyThreadSafe<TControl, TResult>(this TControl self, Func<TControl, TResult> getter)
    where TControl: Control
{
    if (self.InvokeRequired)
    {
        return (TResult)self.Invoke(getter, self);
    }
    else
    {
        return getter(self);
    }
}

Вы называете это следующим:

bool visible = this.lblNameField.GetPropertyThreadSafe(p => p.Visible)
...