Кэширование - это ключ
Как уже говорили другие, вы должны использовать кэширование, так как вы выполняете повторяющиеся операции дискового ввода-вывода для данных, которые меняются не часто.
Мой пример создает и кэширует List<T>
путей к файлам изображений, которые вам понадобятся для каждого последующего запроса. System.Web.Caching
идеально подходит для этого, потому что вы можете создать объект CacheDependency
непосредственно в вашем каталоге изображений - если файл будет изменен или добавлен, ваш кеш автоматически аннулируется. Затем он воссоздается при следующем запросе.
Избежание дубликатов с HashSet<T>
Могу поспорить, что вы не хотите, чтобы в заголовке появлялись две одинаковые картинки!
Рандомизация с использованием Random.Next
не исключает ранее сгенерированные дубликаты. Я использовал HashSet<T>
в качестве уникального рандомизатора для бедняков, поскольку HashSet<T>
позволит вам только добавлять уникальные значения.
Модель
Эта операция должна быть частью вашей модели в MVC. Вы измените его так, чтобы он соответствовал другим классам извлечения данных, как вам будет удобно.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Caching;
public class RandomImage
{
public static string[] GetImages(string folder, int count)
{
HttpContext context = HttpContext.Current;
string virtualFolderPath = string.Format("/content/{0}/", folder);
string absoluteFolderPath = context.Server.MapPath(virtualFolderPath);
Cache cache = context.Cache;
var images = cache[folder + "_images"] as List<string>;
// cache string array if it does not exist
if (images == null)
{
var di = new DirectoryInfo(absoluteFolderPath);
images = (from fi in di.GetFiles()
where fi.Extension.ToLower() == ".jpg" || fi.Extension.ToLower() == ".gif"
select string.Format("{0}{1}", virtualFolderPath, fi.Name))
.ToList();
// create cach dependency on image randomFolderName
cache.Insert(folder + "_images", images, new CacheDependency(absoluteFolderPath));
}
Random random = new Random();
var imageSet = new HashSet<string>();
if (count > images.Count())
{
throw new ArgumentOutOfRangeException("count");
}
while (imageSet.Count() < count)
{
//using an hashset will ensure a random set with unique values.
imageSet.Add(images[random.Next(count)]);
}
return imageSet.ToArray();
}
}
Контроллер
Доступ к методу в вашем контроллере что-то вроде ....
string[] images = Models.RandomImage.GetImages("myPictures", 4);