윈폼 프로젝트에 공격적. 나는 단순히 아무것도 할 수있는 방법을 볼 수 있지만 응용 프로그램이 최대 역할마다 몇 달에 한 번가비지 콜렉션은 너무 나는 윈폼 프로젝트를 상속하고 나는 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 -
좋은 지적 내 _isBNull에 대한,하지만 그는 유일한 이유는 개체가 실제로 널 것을 확인했다. 내가 아는 한, 오류가 발생할 때 주 스레드 만 실행 중이며 속성에 액세스하고 있습니다 ... – Smoller
@Smoller하지만 이론적으로 * ObjA 인스턴스에서이 속성에 액세스 할 수있는 응용 프로그램에서 실행중인 다른 스레드가 있습니다 ? 이것은 heisenbug와 같이 보이기 때문에 더 자주 스레드 안전 문제가됩니다 ... –