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は例を実行する場合は、(私のPC上の)10%は、このアプリケーションで使用されることをu'll参照してください。でもリスト= nullをとGC.Collect()の後に
私が思う理由は、Channel.ShutdownAsync()を呼び出さないClientBaseです。
そこで質問です:
問題を解決するためのより良い方法は何ですか?
p.s.実際に私は、クライアント
Client: Grpc.Core.ClientBase<TDto>
「プロトコルバッファコンパイラによって生成された」使用して、私は明示的に生成されたクラスにファイナライザを変更することはできません
自分でチャンネルをシャットダウンするのはなぜですか? – Evk
私はそれが最良の解決策であるかどうかはわかりません:{}やfinilize()メソッドを使ってリソースを処分するのがベストプラクティスだと思います... –
あなたはサードパーティのライブラリを使っています。 'IDisposable'、偶数チャンネルを実装しているものはありません)、この場合、最良の方法はチャンネルを終了し、ガベージコレクタのようなものに依存しないでチャンネルを明示的にシャットダウンすることです。さて、とにかくあなた自身を解放できるいくつかのリソースをリリースするためにGCに頼らないのは常にベストです。 – Evk