繁体   English   中英

.Net CF下的测试控制句柄

[英]Test Control Handle under Mobile .Net CF

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

我可以捕获它们,但是我希望我的代码首先捕获它们。

该代码可能适用于整个.Net Framework,但在Compact Framework下不存在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);
      }
    }
  }
}

一个有趣的问题(我从未找到有据可查的文件)是一个控件的句柄直到被查询才真正创建。 在大多数情况下,似乎在框架内部发生的大多数情况都很好,但是在您使用控件进行调用的情况下,有时它并没有发生,并且您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 Compact Framework 2.0中无法检查是否创建,因为Handle是直接在创建的基类中创建的,因此,当您调用new Control()它已经创建了一个句柄。 因此,我发现检查句柄是否仍然有效的唯一方法是访问Handle属性。

如果这引发了ObjectDisposedException,则您知道它没有有效的句柄。 如果没有异常发生,则句柄仍然有效。

.NET Compact Framework 2.0中不存在IsDisposed属性,因此不知道先前的答案是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM