Без фактической базы данных я не уверен, сработает ли это, но вот моя попытка:
var qryResults =
(from r in dbContext.Routes
join br in dbContext.BrokerRoutes on r.RouteId equals br.RouteId
where br.Broker.ApiKey == apiKey
join pr in dbContext.RoutePathFilters.Include(x => x.PathFilter) on r.RouteId equals pr.RouteId into paths
group new { r, paths } by r.RouteId into rprg
let r = rprg.First().r
select new RouteTemplate {
RouteId = rprg.Key,
Version = r.Version.Version,
Url = r.Url,
IsActive = r.IsActive,
Paths = rprg.Select(rpr => rpr.paths.First().PathFilter.FilterName).ToList()
})
.AsNoTracking()
.ToImmutableList();
Дело не только в большом количестве изображений. Достаточно одного большого изображения, чтобы задержать рендеринг до тех пор, пока оно не будет загружено, и это может быть весьма заметно, когда размеры вашего изображения начинают увеличиваться тысячами.
Я согласен с вами, что это, вероятно, поток рендеринга: I выполнил тест, и поток пользовательского интерфейса все еще успешно отправлял сообщения, в то время как эта задержка рендеринга происходила из-за попытки отобразить полностью предварительно кэшированный BitmapImage.
Это должно быть какое-то преобразование или подготовка изображения, как вы спекуляционные. Я пытался смягчить это в своем приложении, «рендеринг», но скрывая изображение, а затем раскрывая его, когда мне нужно показать его. Однако это далеко не идеально, потому что замораживание рендеринга происходит в любом случае.
(Правка)
Некоторое продолжение: После обсуждения псевдонима MS WPF я нашел причину задержек. На моей машине с Server 2008 это была комбинация старых видеодрайверов, которые не поддерживают новую модель драйвера WDDM, и задержка для изменения размера изображения.
Если исходный размер изображения отличается от размера дисплея, это приведет к задержке сделать нить до того, как изображение появится. По умолчанию для изображения установлено самое высокое качество, но вы можете изменить параметры масштабирования для рендеринга, вызвав RenderOptions.SetBitmapScalingMode (uiImage, BitmapScalingMode.LowQuality);
. Как только я это сделал, загадочное замораживание перед отображением изображения прошло. Альтернативой, если вам не нравится падение качества при масштабировании, является загрузка BitmapImage с DecodePixelWidth / Height, равным размеру, при котором он будет отображаться.
Также попробуйте следующее:
/* ivis is declared in XAML <Image x:Name="iVis" UseLayoutRounding="True" SnapsToDevicePixels="True" /> */
iVis.Stretch = Stretch.None;
RenderOptions.SetBitmapScalingMode(iVis, BitmapScalingMode.NearestNeighbor);
RenderOptions.SetEdgeMode(iVis, EdgeMode.Aliased);
VisualBitmapScalingMode = BitmapScalingMode.NearestNeighbor;
iVis.Source = **** your bitmap source ****
У меня были проблемы с производительностью при использовании огромного количества цветов канала "A", но дождавшись окончания рендеринга изображения для масштабирования, я стал работать гораздо лучше.
Также, как вы сказали, вы используете плиточную графику?
Обычно вы используете TileBrush, чтобы просто установить его в качестве кисти на вашем элементе FrameworkElement. Если вы анимируете их или добавляете новые динамически, вы можете сгенерировать кисти и применить их к объекту вручную, не забудьте заморозить их, если сможете. Также, VisualBitmapScalingMode является свойством любого Visual.