【问题标题】:Test Control Handle under Mobile .Net CFMobile .Net CF 下的测试控制句柄
【发布时间】:2011-10-30 20:06:42
【问题描述】:

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

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

此代码适用于完整的 .Net Framework,但IsHandleCreatedCompact 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);
      }
    }
  }
}

【问题讨论】:

  • 您到底看到了什么?是不是IsDisposed 是假的,但尝试在父级上调用仍然失败?
  • 它发生得太快了。当我的调试器得到它时,它并不存在。我得到的实际错误消息是Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

标签: c# .net windows-mobile compact-framework


【解决方案1】:

一个有趣的(并且没有很好的记录,我曾经发现)是控件的句柄在被查询之前实际上并没有被创建。似乎在框架内部发生的 ost 情况下就好了,但在您使用控件进行调用的情况下,有时它没有发生并且您得到 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);
    }
} 

【讨论】:

  • 谢谢克里斯。我会对此进行测试并保持联系!
  • 是的,这让我在 IoC 框架中的“UIThread”事件聚合困扰了我很长时间。我花了很长时间才缩小范围。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2023-03-27
    • 2023-03-26
    • 2011-03-13
    • 2021-05-08
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多