gRPC를 사용하여 .net core 2.0 응용 프로그램을 개발 중이며 문제를 발견했습니다. gRPC 클라이언트 클래스의 인스턴스에 대한 참조를 삭제 한 후에 resourses (메모리 및 프로세서)를 사용하는 채널이 여전히 존재합니다. 예제 코드 : 유 예제를 실행하면gRPC 클라이언트가 처분하지 않음 채널
public class MyClient : ClientBase
{
public MyClient(Channel channel) : base(channel)
{
}
}
internal class Program
{
private static void Main(string[] args)
{
var list = new List<MyClient>();
for (var i = 0; i < 10000; i++)
{
Console.WriteLine($"Creating {i} instance");
list.Add(new MyClient(new Channel("127.0.0.1:61783", ChannelCredentials.Insecure)));
}
Console.WriteLine("press enter to list = null");
Console.ReadLine();
list = null;
Console.WriteLine("press enter to GC.Collect();");
Console.ReadLine();
GC.Collect();
Console.WriteLine("press enter to exit");
Console.ReadLine();
}
}
, u'll (내 PC에) 10 %가이 응용 프로그램에서 사용하는 것을 알 수있다. 심지어 목록 = null이 및 하는 GC.Collect() 후
내가 생각하는 이유는 Channel.ShutdownAsync()를 호출하지 않는 ClientBase입니다.
그래서 질문은 :
문제를 해결하기 위해 더 나은 방법은 무엇입니까?
p.s. 실제로 나는 클라이언트
Client: Grpc.Core.ClientBase<TDto>
"프로토콜 버퍼 컴파일러에 의해 생성 된"사용하고 난 명시 적으로 생성 된 클래스에서 종료자를 변경할 수 없습니다
채널을 직접 종료하지 않는 이유는 무엇입니까? – Evk
최상의 솔루션이라고 확신하지 않습니다. {} 또는 finilize() 메소드를 사용하여 리소스를 폐기하는 것이 가장 좋습니다. –
타사 라이브러리를 사용하고 있는데이 라이브러리는 이와 같이 사용하지 않는 것이 좋습니다 (거기에'IDisposable', 즉 짝수 채널을 구현하는 것도 없으므로)이 경우 가장 좋은 방법은 채널을 완료했을 때 채널을 명시 적으로 종료하고 가비지 수집기와 같은 다른 방법을 사용하지 않을 때입니다. 음, 어쨌든 자신을 풀어 놓을 수있는 자원을 공개하기 위해 GC에 의존하지 않는 것이 가장 좋습니다. – Evk