Mobile . net CF下的测试控制句柄

本文关键字:测试 控制 句柄 net CF Mobile | 更新日期: 2023-09-27 18:06:04

当我的线程完成时,我不断抛出异常。

我可以捕获它们,但我宁愿我的代码先捕获它们。

这段代码可以在完整的。net框架下工作,但是在紧凑框架下不存在IsHandleCreated

问题: 我应该用什么来代替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);
      }
    }
  }
}

Mobile . net CF下的测试控制句柄

一个有趣的(我发现没有很好的文档记录)是控件的句柄实际上直到查询它才创建。似乎在大多数情况下,发生在框架内部很好,但在你使用调用控件的情况下,有时它没有发生,你得到一个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);
    }
} 

实际上,在。net紧凑框架2.0是不可能检查创建,因为句柄是直接在基类创建,所以当你调用new Control()它已经创建了一个句柄。所以我发现检查句柄是否仍然有效的唯一方法是访问Handle属性。

如果这抛出一个ObjectDisposedException,那么你就知道它没有有效的句柄。如果没有异常发生,句柄仍然有效。

IsDisposed属性在。net Compact Framework 2.0中不存在,所以不知道前面的答案是关于什么的