저는 4 개의 블록 (하나의 선택적 블록 포함)으로 구성된 응용 프로그램에서 HTTP를 통해 쿼리 개체를 받고 데이터베이스에서 정보를 검색하고 선택적인 작업을 수행하는 Dataflow 파이프 라인을 만들었습니다 해당 데이터를 변환 한 다음 HTTP 응답에 정보를 다시 쓰십시오.데이터 흐름 파이프 라인이 메모리를 유지합니다.
일부 테스트에서는 데이터베이스 (570,000 행)의 상당량의 데이터를 가져 와서 List 개체에 저장하고 다른 블록간에 전달했으며 이후에도 최종 블록이 완료되면 메모리가 해제되지 않습니다. 작업 관리자의 RAM 사용량은 최대 2GB까지 증가하며 List가 각 블록에 도달 할 때 여러 개의 큰 스파이크를 볼 수 있습니다. 내 블록에 대한
서명은 다음과 같이 다음과 같이
private TransformBlock<HttpListenerContext, Tuple<HttpListenerContext, QueryObject>> m_ParseHttpRequest;
private TransformBlock<Tuple<HttpListenerContext, QueryObject>, Tuple<HttpListenerContext, QueryObject, List<string>>> m_RetrieveDatabaseResults;
private TransformBlock<Tuple<HttpListenerContext, QueryObject, List<string>>, Tuple<HttpListenerContext, QueryObject, List<string>>> m_ConvertResults;
private ActionBlock<Tuple<HttpListenerContext, QueryObject, List<string>>> m_ReturnHttpResponse;
그들은 연결되어 있습니다 :
m_ParseHttpRequest.LinkTo(m_RetrieveDatabaseResults);
m_RetrieveDatabaseResults.LinkTo(m_ConvertResults, tuple => tuple.Item2 is QueryObjectA);
m_RetrieveDatabaseResults.LinkTo(m_ReturnHttpResponse, tuple => tuple.Item2 is QueryObjectB);
m_ConvertResults.LinkTo(m_ReturnHttpResponse);
내가 같은 파이프 라인을 설정할 수 있습니다 가능성이 각 블록이 완료되면 그 목록에 더 이상 저장할 필요가 없으며 전체 파이프 라인이 완료되면 메모리가 해제됩니다.