Помогите мне с этим CrossThread?

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

Со следующим кодом:

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. 

Зачем?

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

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

 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».

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

 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( ... ); } 

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