私は困惑しています。おそらく、誰かが私が観察しているWCFのクライアントの振る舞いについていくつかの光を当てることができます。WCFの使用、終了、拡張子
WCFサンプルを使用して、私はWCFクライアント/サーバー通信のさまざまなアプローチを試し始めました。 1Mテストリクエストを並行して実行している間、私はSysInternals TcpViewを使って開いているポートを監視していました。
- あなたのことを行う、クライアントを作成し、GCがあなたのことを行う よりも、使用してブロック内のクライアントを作成します
- それを収集してみましょう:今、クライアントを呼び出すために、少なくとも4つの異なる方法があります。
- あなたのもの
- は、クライアントまたはチャネルを作成し、しかし、私の知る限り、今だけのオプション2-4をあなたのもの
を行うためにWCF Extensionsを使用しないよりも、使用してブロック内の工場からクライアントチャネルを作成します。明示的に呼び出すclient.Close()。実行中、TIME_WAIT状態のポートが多く残っています。 GCに依存しているため、オプション1が最悪のシナリオになると思います。しかし、私の驚いたことに、それはすべての中で最もクリーンであるように見えます。つまり、残っている港は残っていません。
私には何が欠けていますか?
UPDATE:ソースコード
private static void RunClientWorse(ConcurrentBag<double> cb)
{
var client = new CalculatorClient();
client.Endpoint.Address = new EndpointAddress("net.tcp://localhost:8000/ServiceModelSamples/service");
RunClientCommon(cb, client);
}
private static void RunClientBetter(ConcurrentBag<double> cb)
{
using (var client = new CalculatorClient())
{
client.Endpoint.Address = new EndpointAddress("net.tcp://localhost:8000/ServiceModelSamples/service");
RunClientCommon(cb, client);
}
}
private static void RunClientBest(ConcurrentBag<double> cb)
{
const string Uri = "net.tcp://localhost:8000/ServiceModelSamples/service";
var address = new EndpointAddress(Uri);
//var binding = new NetTcpBinding("netTcpBinding_ICalculator");
using (var factory = new ChannelFactory<ICalculator>("netTcpBinding_ICalculator",address))
{
ICalculator client = factory.CreateChannel();
((IContextChannel)client).OperationTimeout = TimeSpan.FromSeconds(60);
RunClientCommon(cb, client);
}
}
private static void RunClientBestExt(ConcurrentBag<double> cb)
{
const string Uri = "net.tcp://localhost:8000/ServiceModelSamples/service";
var address = new EndpointAddress(Uri);
//var binding = new NetTcpBinding("netTcpBinding_ICalculator");
new ChannelFactory<ICalculator>("netTcpBinding_ICalculator", address).Using(
factory =>
{
ICalculator client = factory.CreateChannel();
((IContextChannel)client).OperationTimeout = TimeSpan.FromSeconds(60);
RunClientCommon(cb, client);
});
}
あなたはいくつかのソースコードがありません...ユニットテストを見ることができますか? –
http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-block-issue-使用ブロックはWCFで問題を引き起こす可能性があります。 – TrueWill
リンクをありがとう、面白いですが、GCがなぜTIME_WAITを残しているのかをまだ説明していませんが、client.Close()はそれを説明していません。 – Darek