Как установить значение переменной в делегатской функции «BeginInvoke» в C #? - PullRequest
1 голос
/ 21 мая 2011

У меня есть этот код в другом потоке:

string sub = "";

this.BeginInvoke((Action)(delegate()
{
    try
    {
        sub = LISTVIEW.Items[x].Text.Trim();
    }
    catch
    {

    }
}));

MessageBox.Show(sub);

Я хочу получить значение "LISTVIEW.Items[x].Text.Trim();" и передать его в "sub".обратите внимание, что элемент управления LISTVIEW находится в главном потоке.Теперь, как я могу это сделать?

enter code here

1 Ответ

2 голосов
/ 21 мая 2011
        Func<string> foo = () =>
            {
                try
                {
                    return LISTVIEW.Items[x].Text.Trim();
                }
                catch
                {
                     // this is the diaper anti-pattern... fix it by adding logging and/or making the code in the try block not throw
                     return String.Empty;

                }
            };

        var ar = this.BeginInvoke(foo);

        string sub = (string)this.EndInvoke(ar);

Вы, конечно, должны быть немного осторожны с EndInvoke, потому что это может вызвать взаимные блокировки.

если вы предпочитаете синтаксис делегата, вы также можете изменить

this.BeginInvoke((Action)(delegate()

до

this.BeginInvoke((Func<String>)(delegate()

вам нужно вернуть что-то из всех веток и вызвать call end.

...