2012-10-31 99 views
1

當應用程序收到來自服務的呼叫時,會爲每個呼叫打開一個表單。用戶必須在每個窗口中輸入並關閉它。爲了平滑用戶的工作,我正嘗試重新激活用戶在顯示下一個窗口時正在處理的窗口。當檢查IsDisposed和Disposing時,「無法訪問已處理的對象」

這樣做的方法如下:

private void ActivatePreviousActiveForm() { 

    if (_activeWhenOpen != null && _activeWhenOpen.InvokeRequired) { 
     if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed) 
       _activeWhenOpen.Invoke((MethodInvoker)ActivatePreviousActiveForm); 
    } else 
     if (_activeWhenOpen != null && !(_activeWhenOpen is FrmRuntimeError)) 
      _activeWhenOpen.Activate(); 
} 

有時它拋出「到達線

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed) 

有誰知道爲什麼會發生這種情況時,」無法訪問已釋放的對象」

+4

一個快速的猜測是,你應該嘗試去反轉這個條件。可能如果一個物體被完全丟棄,處置會出錯。 – LightStriker

+0

可能是因爲CLR垃圾收集器已經清理了已處理的對象,因此它不再存在。 – Liam

+2

@Liam:處理一個對象不會使它被GC收集,因爲它仍然在方法中被引用。 – LightStriker

回答

4

嘗試反轉如果條件:

此行

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)

有可能成爲

if (!_activeWhenOpen.IsDisposed || !_activeWhenOpen.Disposing)

那是因爲條件的順序檢查它們被寫入,所以你的代碼可能會被調用l Disposing放在一個被遺棄的物體上,這會增加你的錯誤。

編輯:

我也認爲你應該改變||& &,因爲如果您的窗口未處置但處於處置狀態,則可能有錯誤。

+3

我想我應該創建答案,而不是將其置於評論中。 :D – LightStriker

+0

whops!當我點擊答案按鈕時,我沒有看到評論!抱歉! –

+0

@il_gury:不要抱歉,我只是不完全確定 – LightStriker

1

您無法訪問已處理的對象,爲什麼處理它?當用戶關閉表單時,關閉的默認行爲是處理它。爲了防止這種情況發生,您我必須重寫Close方法,所以它只是隱藏表單而不是處理它。像這樣:

// Use this event handler for the FormClosing event. 
private void YourFormClosing(object sender, FormClosingEventArgs e) 
{ 
    this.Hide(); 
    e.Cancel = true; // this will cancel the close event. 
} 

問候。

+1

如果使用ShowDialog方法顯示窗體,則窗體不會自動放置,只有使用Show方法顯示該窗體。 –

相關問題