次の方法があり、コンソール アプリケーションで使用します。
static async Task<List<Task<CompositeType>>> callSvcAsync(List<CompositeType> listC)
{
ChannelFactory<IWcfServiceLayerChannel> cn = new ChannelFactory<IWcfServiceLayerChannel>("MyWcFServiceEndpoint");
var c = cn.CreateChannel();
List<Task<CompositeType>> listTasks = new List<Task<CompositeType>>();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < loopCount; i++)
{
Task<CompositeType> res = c.GetDataUsingDataContractAsync(new CompositeType() { BoolValue = true, StringValue = "SomeString" });
listTasks.Add(res);
}
CompositeType[] value = await Task.WhenAll(listTasks);
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalSeconds);
listC.AddRange(value);
**c.Dispose();**
return listTasks;
}
コードは wcf メソッドを 1000 回呼び出しています。その後、リスト オブジェクトが作成され、操作にかかった時間がコンソールに表示されます。wcf チャネルを破棄しても何も起こりません。メソッドは呼び出し元のコードに戻りません。「\c.Dispose()」をコメントアウトすると、すべて正常に動作します。
何か案は?
編集: 上記の質問に対する回答はありませんが、次のコードは機能します:
async public static Task<CompositeType[]> AsyncWcfCall()
{
ChannelFactory<IWcfServiceLayerChannel> cn = new ChannelFactory<IWcfServiceLayerChannel>("MyWcFServiceEndpoint");
var c = cn.CreateChannel();
c.Open();
List<Task<CompositeType>> listTasks = new List<Task<CompositeType>>();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < loopCount; i++)
{
var res = c.GetDataUsingDataContractAsync(new CompositeType() { BoolValue = true, StringValue = "SomeString" });
listTasks.Add(res);
}
return await Task.WhenAll(listTasks).ContinueWith((ct) =>
{
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalSeconds);
try
{
cn.Close(); c.Dispose();
}
catch { }
return ct.Result;
});
}