문제

메모리 누출을 조사하는 동안 나는 루프 내부의 테이블에서 Newrow ()에게 전화하여 여러 번 전화하여 발생한다는 것을 알게되었습니다. 그러나 생성 된 Datarow는 테이블 행 컬렉션에 결코 추가되지 않았으며 테이블 행 카운트는 결코 0을 초과하지 않았습니다.

내 질문은 새로 생성 된 Datarow가 행에 추가되지 않더라도 Newrow가 호출 될 때마다 더 많은 메모리를 사용하는 이유입니다. Newrow에서 반환 된 Datarow는 항상 동일한 로컬 변수에 할당됩니다 (따라서 마지막 New Row를 폐기하는 것 같습니다. ).

코드가 테이블에 추가되지 않는 DataRows를 생성하는 이유를 무시하십시오!

도움이 되었습니까?

해결책

DataRow는 데이터 가능에서 스키마를 상속하므로 Datarow에서 행을 생성 한 테이블 스키마에 대한 참조가 있습니다. 새 행은 테이블의 분리 상태에 있습니다.
이것이 바로 GC가 새로운 사용하지 않은 행을 단독으로 떠난 이유입니다.

다른 팁

DataTable.newrow ()는 생성 된 행을 DataTable의 레코드 메너에 추가합니다. 왜 이런 일이 일어나는지 확실하지는 않지만 이것이 GC에 의해 해방되지 않은 이유입니다.

Datarow를 제거하는 방법에는 두 가지가있는 것으로 보입니다.

  1. 테이블에 추가 한 다음 삭제하십시오.
  2. dataTable.clear ()를 호출하십시오.

두 가지 문제가 관련되어 있다고 생각합니다.

Table.Newrow는 초기 테이블과 동일한 열 형식을 가진 새 데이터 행을 만듭니다.

이 새 행은 Table.rows.add (Newrow)를 사용하여 테이블에 추가해야합니다. 루프는 사용되지 않은 객체를 만들어 메모리를 먹게됩니다. 자세한 내용은이 기사를 참조하십시오http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx

newrow = table.newrow ()를 만들고 아래 코드 에서이 Newrow보다 더 필요하지 않습니다. 1) 테이블에 행을 추가하십시오. 2) 제거하면 메모리 누출을 방지합니다.

    var table = new DataTable();
    while (true)
    {
        var newRow = table.NewRow();
        table.Rows.Add(newRow);   //Without this 2 rows you will have memory leak.
        table.Rows.Remove(newRow);//
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top