2013-11-15 1 views
0

윈폼 프로젝트에 공격적. 나는 단순히 아무것도 할 수있는 방법을 볼 수 있지만 응용 프로그램이 최대 역할마다 몇 달에 한 번가비지 콜렉션은 너무 나는 윈폼 프로젝트를 상속하고 나는 GC 문제가되는으로 좁혀 이상한 문제가있는

:-) 달리 말해 주시기 수 없습니다. 나는 그것을 정기적으로 재현 할 수 없었지만 내 고객에게 몇 번이나 일어났습니다. 그리고 두 번이나 제 개발자 환경에서 보았습니다 (그러나 그것을 찾지는 못했습니다). 다음 코드 단순화로

셋업이다.

public class Main 
{ 
    Main() 
    { 
    var listOfB = new List<ObjB>(); 
    var objB = new ObjB(); 
    listOfB.Add(objB); 
    var objA = new ObjA(objB); 

    // Do alot of stuff with listOfB and different lists of objA-like-objects. 
    // Sometimes objA only exists as objects in a DataGrid 

    // listOfB exists for a long time, while objA comes and goes.. 
    } 
} 

class ObjA 
{ 
    private bool _isBNull; 
    private ObjB _objB; 

    public ObjA(ObjB objB) 
    { 
    _objB = objB; 
    _isBNull = objB == null; 
    } 

    public ObjB ObjB 
    { 
    get 
    { 
     if (!_isBNull && _objB == null) 
     { 
     // 
     // This should NEVER happen, but happens anyway :-(
     // 

     // Do some logging and now that we 
     // know it CAN happen anyway we throw up... 
     } 
     return _objB; 
    } 
    set 
    { 
     _isBNull = value == null; 
     _objB = value; 
    } 
    } 
} 

class ObjB 
{ 
} 

는 그리고 우리는 objB가 null 인-해야 불가능한 상태에서 생을 마감하지만, 우리의 디버그 트랙 부울은 우리가해서는 안 알려줍니다.

경험이있는 사람이 있습니까? 무엇을해야하는지, 어디를보아야하는지에 대한 제안?

프로젝트

닷넷 4.0이며, 오류가 32 비트 XP 및 64 비트 윈도우 7 클라이언트 시스템에서 볼 수있다.

Smøller -

답변

5

귀하의 문제가 아니라 GC에, 당신의 세터에있는의 WinForm 초보자 :

set 
{ 
    _isBNull = value == null; 
    _objB = value; 
} 

는 세터/게터는 스레드에 안전, 당신은 게터 액세스하는 여러 스레드가있는 경우되지 않으며, setter 동시에 _isBNull == null 및 _objB가 객체 인 상황을 얻을 수 있습니다. 현재 코드에서 볼 때

나는 당신이 고정 확인해야 변화가 정말 클래스에 대한 기능적 요구 사항에 따라, 별도의 속성 _isBNull이 어떤 이유가 표시되지 않습니다. 나는 그것을 할 수 없습니다 예상 한

+0

좋은 지적 내 _isBNull에 대한,하지만 그는 유일한 이유는 개체가 실제로 널 것을 확인했다. 내가 아는 한, 오류가 발생할 때 주 스레드 만 실행 중이며 속성에 액세스하고 있습니다 ... – Smoller

+0

@Smoller하지만 이론적으로 * ObjA 인스턴스에서이 속성에 액세스 할 수있는 응용 프로그램에서 실행중인 다른 스레드가 있습니다 ? 이것은 heisenbug와 같이 보이기 때문에 더 자주 스레드 안전 문제가됩니다 ... –

관련 문제