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