InvokeRequired сомнение - PullRequest
       21

InvokeRequired сомнение

1 голос
/ 02 мая 2011

Следующий метод будет вызываться из потока без пользовательского интерфейса.Должен ли я проверить InvokeRequired для вызова этих элементов в методе?

a.this._moduleStatusGrid.Invalidate ()
b.this.Close ()

private void CheckIfAllModulesInitComplete()
      {
        this._moduleStatusGrid.Invalidate();
        if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
        {
          this._footprint.DeActivate();
          this.Close();
        }
      }

Ответы [ 2 ]

3 голосов
/ 02 мая 2011

Control.Invoke и Control.BeginInvoke безопасны для вызова из потока пользовательского интерфейса и потоков, не относящихся к пользовательскому интерфейсу, поэтому, если вы уже знаете, что находитесь в потоке без пользовательского интерфейса, нет никакого вреда (IMO), пропускающего проверку и просто вызывающего Invoke / BeginInvoke.

Пример:

anyControl.Invoke((MethodInvoker)delegate{
    // anything to run on UI thread here
});
0 голосов
/ 02 мая 2011

Звучит так, как будто вы спрашиваете одного из следующих

  1. Учитывая, что этот метод выполняется в фоновом потоке, в методах Invalidate и Close я должен проверять свойство InvokeRequired?
  2. Учитывая, что этот метод запускается в фоновом потоке, свойство InvokeRequired всегда будет возвращать false, так что я должен просто избегать его проверки?

Для № 1 ответ - нет. Методы Close и Invalidate не обязаны проверять свойство InvokeRequired. Неявная часть их контракта заключается в том, что свойство InvokeRequired должно быть ложным до их вызова.

Для # 2, да, если он всегда вызывается в фоновом потоке, я бы пропустил проверку и просто перешел к методам Invoke.

В любом случае я бы переписал метод следующим образом.

private void CheckIfAllModulesInitComplete()
{
  MethodInvoker del = delegate {
    this._moduleStatusGrid.Invalidate();
    if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
    {
      this._footprint.DeActivate();
      this.Close();
    }
  };
  this.Invoke(del, null);
}
...