Эта ссылка говорит, что вам не нужно закрывать запрос:
http://forums.silverlight.net/forums/p/29299/95656.aspx
1: ServiceClient client = new ServiceClient();
2: client.MakeRequestCompleted += (sender, e) =>...
3: client.MakeRequestAsync();
MakeRequestCompleted является делегатом. После завершения запроса вызов выполняется.
Если вы сделаете строки 1 и 2 общими для всего запроса, вы должны связать одно и то же событие с одинаковыми аргументами для каждого запроса. Затем в коде реализации вы не знаете, какой вызов вызвал какое событие. [1]
Если вы попытаетесь сделать только одну строку общей, у вас будет все больше и больше событий, и вы действительно не сможете отписаться от темы в безопасности потока.
Итак, можете ли вы проверить, насколько сильно страдает производительность, если вы просто сделаете все эти строки для каждого запроса?
for (int i = 0; i < 1000; i++)
{
ServiceClient client = new ServiceClient();
client.MakeRequestCompleted += (sender, e) =>...
client.MakeRequestAsync();
}
(Тогда, конечно, вы должны использовать кеш и использовать меньше запросов.)
[1]: Это может быть хорошо, если вы создаете просто «молоток-клиент», подобный этому, но если вам нужна некоторая реальная реализация, общих аргументов событий может быть недостаточно.