2009-05-16 2 views
0
 if (listBox1.InvokeRequired) 
     { 
      listBox = new StringBuilder(this.listBox1.Text); 
     } 

Это код в C#, который при выполнении вызывает недопустимую ошибку операции поперечного потока для listBox1, которая является списком в моей форме. Может, ребята, пожалуйста, скажите мне, почему? Я тоже использую метод invokeRequired и не изменяю содержимое списка.ошибка ошибки перекрестных ошибок

ответ

5

InvokeRequired сообщает, что для корректного доступа к элементу необходим Invoke. Это не делает доступ законным. Вы должны использовать метод Invoke, чтобы подтолкнуть обновление для соответствующего потока

Action update =() => listbox = new StringBuilder(this.listBox1.Text); 
if (listBox1.InvokeRequired) { 
    listBox1.Invoke(update); 
} else { 
    update(); 
} 
+0

Я думал, что стиль распорка при MS открывал скобку на отдельной линии?!? ;) –

+0

@Mitch, MS не имеет официального стиля, но многие группы используют скобки в правиле новой строки. Это также мое предпочтение языкам стиля C. Но когда я отправляю код в Интернет, я использую тот же стиль линии, чтобы сделать примеры более краткими :) – JaredPar

+0

Проект Mono на самом деле определяет однотипную практику для всего его источника, полностью противоречащую рекомендациям Microsoft/StyleCop - и это не так. единственное, что они делают контрастно. Опять же, зачем им следовать примеру Microsoft? Заставляет меня задаться вопросом, хотят ли они просто злорадствовать разработчикам MS. : P Лично такой же стиль кажется мне немного уродливым, хотя, возможно, это просто привычка. В любом случае, это конечно * приемлемо *. – Noldorin

3

InvokeRequired просто проверяет, требуется ли Invoke. Вы нашли, что это необходимо, но не вызвали Invoke!

2

Ваш код должен работать, когда InvokeRequired ложно

delegate void SetListBoxDelegate(); 

void SetListBox() 
{ 
    if(!InvokeRequired) 
    { 
     listBox = new StringBuilder(this.listBox1.Text); 
    } 
    else 
     Invoke(new SetListBoxDelegate(SetListBox)); 
} 

Edit: Заканчивать Making Windows Forms thread safe