아래 코드는 File object를 만든 후 콜백을 추가한 다음, Length가 Load되면 콜백 함수에서 Items에 file을 추가하는 코드이다.
public void Add(string file)
{
File fileItem = new File(file);
fileItem.LengthLoaded += FileItem_LengthLoaded;
}
private void FileItem_LengthLoaded(File file)
{
Items.Add(file);
}
논리상으로는 아무런 문제가 없다. Length가 load되는 코드에 문제가 있지 않는 이상은 Add가 호출된 횟수만큼 FileItem_LengthLoaded도 호출될 것이다. 하지만 직접 실행시켜보면 예상치 못한 결과가 나온다. Add가 호출된 횟수보다 FileItem_LengthLoaded가 호출된 횟수가 더 작은 것이다. 이건 garbage collect 때문에 그렇다. fileItem에 대한 reference count가 0이 되니까 garbage collector가 file instance를 삭제시켜버리는 것이다.
List<File> files = new List<File>();
public void Add(string file)
{
File fileItem = new File(file);
files.Add(fileItem);
fileItem.LengthLoaded += FileItem_LengthLoaded;
}
private void FileItem_LengthLoaded(File file)
{
Items.Add(file);
}
이런 식으로 reference를 유지시켜주면 file instance가 사라지지 않는다.
'C#' 카테고리의 다른 글
class vs struct (0) | 2023.05.18 |
---|---|
[C# Windows] System.IO.Path.GetTempPath 쓰지 마라. (0) | 2023.05.09 |
개발자와 사용자의 관점 차이 (0) | 2023.03.14 |
MultiBinding 간단한 예제 (0) | 2023.03.11 |
인생은 살기 힘들다는데 (0) | 2023.03.08 |
댓글