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

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

0 голосов
/ 03 декабря 2008

Этот код выполняется многими способами. Когда он выполняется кнопкой формы, он работает (кнопка запускает поток и в цикле вызывает этот метод = он работает). НО это не работает, когда у меня есть вызов этого метода из моего 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.

Почему?

Ответы [ 3 ]

6 голосов
/ 03 декабря 2008

Вам необходимо вернуться в конце блока 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 голос
/ 03 декабря 2008

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

1 голос
/ 03 декабря 2008

Вам нужно написать это:

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

OR

if ( this.form.InvokeRequired ) {
    this.form.Invoke( ...... );
}
else {
    this.form.Size = new Sizte( ... );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...