2012-10-31 3 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

빠른 추측은 조건을 반전시켜야한다는 것입니다. 아마도 객체가 완전히 처분되면 처분 (disposing)하면 버그가 발생합니다. – LightStriker

+0

아마도 CLR 가비지 수집기가 이미 삭제 된 개체를 정리하여 더 이상 실제로 존재하지 않기 때문일 수 있습니다. – Liam

+2

@Liam : 개체를 삭제해도 메서드에서 계속 참조되므로 개체를 GC로 수집하지 않습니다. – LightStriker

답변

4

시도는 경우 상태를 반전하기 :

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

가있다이 라인이되기위한 조건이 순서대로 확인되기 때문이다

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

그들은 작성되었으므로 코드가 cal이 될 수 있습니다. l Disposing을 삭제하여 오류가 발생합니다.

편집 :

나는 또한 당신이 을 변경해야한다고 생각 ||에서 & &으로 변경하십시오. 왜냐하면 귀하의 창은 처분되지 않았지만 처분 상태에 있기 때문에 오류가있을 수 있습니다.

+3

나는 코멘트에 넣는 대신 대답을 만들어야한다고 생각한다. : D – LightStriker

+0

쿵! 나는 대답 단추를 클릭 할 때 주석을 보지 못했습니다! 죄송합니다! –

+0

@il_gury : 미안하지 마라, 나는 단지 충분히 확신하지 못했다. – LightStriker

1

처분 된 개체에 액세스 할 수없는 이유 처분되는 이유 사용자가 양식을 닫으면 닫는 기본 동작은 처분하는 것입니다. Close 메서드를 재정 의하여 폼을 숨기지 않고 그냥 숨 깁니다. 좋아요 :

감사합니다.

+1

Show 메서드로 표시되는 경우에만 ShowDialog 메서드를 사용하여 폼을 표시하면 폼이 자동으로 삭제되지 않습니다. –

관련 문제