簡體   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