2011-08-19 17 views
0

当我的线程完成时,我不断收到抛出的异常。移动.Net下的测试控制句柄CF

我可以抓住他们,但我宁愿我的代码先抓住他们。

该代码可以用于完整的.Net 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); 
     } 
    } 
    } 
} 
+0

你究竟看到了什么? IsDisposed是否为false,但试图对父级调用仍然失败? – ctacke

+0

它发生得太快。当我的调试器得到它时,它不存在。我得到的实际错误信息是'Invoke或BeginInvoke无法在控件上调用,直到窗口句柄被创建。' – jp2code

回答

1

一个有趣的(而不是有据可查的,我曾经找到)是一个控件的句柄是不实际创建之前进行查询。看起来,在框架内部发生的情况下,似乎很好,但在使用调用控件的情况下,有时候它没有发生,并且你得到一个异常。

我的解决方案一直是在早期直接查询句柄。在你的情况下,你可能会得到类似的东西(如你的评论暗示):

bool ParentOk 
{ 
    get 
    { 
     return (_parent != null) 
      && (!_parent.IsDisposed) 
      && (_parent.Handle != IntPtr.Zero); 
    } 
} 
+0

感谢Chris。我会测试这个并保持联系! – jp2code

+0

似乎正在工作!没有错误。标记为答案。 – jp2code

+0

是的,在我的IoC框架中,我的“UIThread”事件聚合很长一段时间。让我永远把它缩小。 – ctacke