当我的线程完成后,我不断抛出异常。
我可以抓住它们,但我宁愿我的代码首先抓住它们。
此代码可以用于完整的.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);
}
}
}
}
答案 0 :(得分:1)
一个有趣的(并且我没有找到过很好的文档记录)是在查询控件的句柄之前实际上并未创建它。似乎在框架内部发生的ost情况很好,但是在你使用Invoking控件的情况下,有时它没有发生并且你得到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);
}
}
答案 1 :(得分:0)
实际上,在.NET Compact Framework 2.0中无法检查是否创建,因为Handle是直接在创建的基类中创建的,因此在调用new Control()
时已经创建了一个句柄。因此,我发现检查句柄是否仍然有效的唯一方法是访问Handle
属性。
如果此方法引发ObjectDisposedException,则您知道它没有有效的句柄。 如果没有异常发生,则句柄仍然有效。
.NET Compact Framework 2.0中不存在IsDisposed
属性,因此不知道先前的答案是什么。