Я занимаюсь рефакторингом большой программы, которая выполняет межпроцессное взаимодействие через wcf. Поскольку клиент имеет прямой доступ к интерфейсу службы, для создания каналов используется канал, поэтому дополнительные заглушки службы клиента не требуются. Связь состоит из множества больших сообщений, которые запрашиваются с высокой частотой (в настоящее время используется NetTcpBinding, я рассматриваю переход на NetNamedPipeBinding).
Мой вопрос касается разницы между созданием / закрытием канала и созданием / закрытием канала. Чтобы быть более точным: Channelfactory создает канал. Теперь в отношении отдельного запроса: должен ли я создать и закрыть фабрику каналов, а вместе с этим и канал в отношении отдельного запроса (см. Решение № 2), или это более безопасно / лучше с точки зрения производительности, только создавать / закройте канал относительно отдельного запроса и оставьте канал открытым для нескольких запросов (см. решение № 1).
1)
//set up the channel factory right when I start the whole applicaton
ChannelFactory<IMyService> cf = new ChannelFactory<IMyService>();
//call this trillion of times over time period of hours whenever I want to make a request to the service; channel factory stays open for the whole time
try
{
IMyService myService = cf.CreateChannel();
var returnedStuff = myService.DoStuff();
((IClientChannel)myService).Close();
}
catch ...
//close the channel factory when I stop the whole application
cf.Close();
2)
//call this trillion of times over time period of hours whenever I want to make a request to the service
try
{
ChannelFactory<IMyService> cf = new ChannelFactory<IMyService>();
IMyService myService = cf.CreateChannel();
var returnedStuff = myService.DoStuff();
cf.Close();
}
catch ...
Каковы практические различия? Как правильно это сделать? Есть ли еще лучшие альтернативы?