Тест управления ручкой под Mobile .Net CF - PullRequest
0 голосов
/ 19 августа 2011

Когда мои потоки завершаются, я получаю исключения.

Я могу их поймать, но я бы предпочел, чтобы мой код сначала их поймал.

Этот код может работать для полной .Net Framework, но IsHandleCreated не существует в Compact Framework .

Вопрос: Что я должен использовать вместо IsHandleCreated?

Control _parent; // set when custom BackgroundWorker like class is created

bool parentOk {
  get {
    if (_parent != null) {
      if (!_parent.IsDisposed) {
        return _parent.IsHandleCreated;
        // Should I instead "return (_parent.Handle != IntPtr.Zero);"?
      }
    }
    return false;
  }
}

public void ReportProgress(int step, object data) {
  lock (_thLock) {
    if (parentOk && (ProgressChanged != null)) {
      MethodInvoker methInvoker = delegate { ProgressChanged(step, data); };
      try {
        _parent.BeginInvoke(methInvoker); // recently changed from below
        // _parent.Invoke(methInvoker); (old technique)
      } catch (ObjectDisposedException) { // added for BeginInvoke
      } catch (NullReferenceException err) {
        Global.LogError(_CODEFILE + "ReportProgress", err);
      } catch (InvalidOperationException err) {
        Global.LogError(_CODEFILE + "ReportProgress", err);
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Интересным (и недостаточно хорошо документированным, что я когда-либо обнаруживал) является то, что дескриптор элемента управления фактически не создается до тех пор, пока его не запросят.Кажется, что в некоторых случаях это происходит внутри фреймворка просто отлично, но в тех случаях, когда вы используете элемент управления для вызова, бывают случаи, когда этого не произошло, и вы получаете Invoke or BeginInvoke cannot be called on a control until the window handle has been created Исключение.

Моим решением всегда было запросить дескриптор непосредственно на ранней стадии.В вашем случае вы, вероятно, можете сойти с рук что-то вроде этого (как подсказывает ваш комментарий):

bool ParentOk
{
    get
    {
        return (_parent != null)
            && (!_parent.IsDisposed)
            && (_parent.Handle != IntPtr.Zero);
    }
} 
0 голосов
/ 16 июля 2018

На самом деле в .NET Compact Framework 2.0 невозможно проверить создание, поскольку дескриптор является прямым в созданном базовом классе, поэтому при вызове new Control() он уже создал дескриптор. Таким образом, единственный способ проверить, действителен ли дескриптор, - это получить доступ к свойству Handle.

Если это вызывает исключение ObjectDisposedException, то вы знаете, что у него нет действительного дескриптора. Если исключение не произошло, дескриптор все еще действителен.

Свойство IsDisposed не существует в .NET Compact Framework 2.0, поэтому не знаю, о чем был предыдущий ответ.

...