У меня есть веб-сервис WCF, который я использую для отправки изображений из моего клиентского приложения Windows Mobile на мой сервер.
Когда я пытаюсь отправить изображения, я не могу загрузить их все из базы данных одновременно, или я получу исключение нехватки памяти. Поэтому я думаю, что позвоню в мой веб-сервис с партиями по 10 или около того.
Что я хочу знать, так это то, что если я настрою IEnumerable
и yield
изображений из базы данных по 1 за раз, будет ли освобождена память после каждой отправки пакета?
Я знаю, что полагаться на сборщик мусора для быстрой очистки, как правило, плохая идея. Поэтому я не решаюсь сделать это (и, следовательно, причина, по которой я спрашиваю).
Единственный другой вариант, который я вижу, - это вызвать базу данных, чтобы получить данные в наборах по 10 (кажется, не элегантно, но мне, возможно, придется это сделать).
Позвольте мне подвести итог с примером. Скажем, у меня есть следующий код. Когда элемент, возвращаемый yield (MyYieldingEnumerable), освободит память (или, по крайней мере, будет доступен для сборки мусора)?
public void SendImages()
{
List<ImageItem> itemsToSend = new List<ImageItem>();
int count = 0;
foreach (ImageItem curImageItem in MyYieldingEnumerable())
{
itemsToSend.Add(curImageItem);
count++;
if (count >= 10)
{
myService.SendItems(itemsToSend);
// #1 When the last reference to it is removed
// |
// v
itemsToSend = new List<ImageItem>();
count = 0;
}
}
// <----- #2 After the loop ends
}
// <------- #3 After the method exits
Будут ли они в памяти по 10 партий или все они останутся в памяти одновременно?