2008-12-03 3 views
0

Этот код выполнен многими способами. Когда он выполняется кнопкой формы, он работает (кнопка запускает поток и в цикле он вызывает этот метод = он работает). НО это не работает, когда у меня есть вызов этого метода из моего BackgroundWorker в форме.Помогите мне с этим CrossThread?

С помощью следующего кода:

private void resizeThreadSafe(int width, int height) 
{ 
    if (this.form.InvokeRequired) 
    { 
     this.form.Invoke(new DelegateSize(resizeThreadSafe), 
      new object[] { width, height }); 
    } 
    this.form.Size = new Size(width, height); // problem occurs on this line 
    this.form.Location = new Point(0, 0); // dummy coordinate 
} 

Тогда на линии, содержащей this.form.Size = ... я получаю следующее исключение:

InvalidOperationException was unhandled 
Cross-thread operation not valid: Control 'Form1' accessed from a thread other 
than the thread it was created on. 

Почему?

ответ

6

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

Других слов (если вы хотите вырезать и вставить код вместо рисунка, это было бы проще ...)

private void resizeThreadSafe(int width, int height) 
{ 
    if (this.form.InvokeRequired) 
    { 
     this.form.Invoke(new DelegateSize(resizeThreadSafe, 
      new object[] { width, height }); 
     return; 
    } 
    this.form.Size = new Size(width, height); 
    this.form.Location = new Point(0, SystemInformation.MonitorSize // whatever comes next 
} 

В качестве альтернативы просто поставить вторую половину методы в " else ".

1

Вам нужно написать следующее:

if (this.form.InvokeRequired) { 
    this.form.Invoke(......); 
    return; 
} 
this.form.Size = new Sizte(...); 

ИЛИ

if (this.form.InvokeRequired) { 
    this.form.Invoke(......); 
} 
else { 
    this.form.Size = new Sizte(...); 
} 
1

В зависимости от вашего стиля кодирования или использовать возврат прямо после Invoke или положить фактическое действие как еще блок.

Смежные вопросы