Я исследовал проблемы с производительностью в моем приложении, и оно сводится к тому, что время, необходимое для вызова Invoke, постепенно увеличивалось.Я использую System.Diagnostics.Stopwatch для определения времени самого вызова Invoke, и, хотя он начинается через 20 мс, после нескольких сотен вызовов он составляет около 4000 мс.Ведение журнала показывает, что время постоянно увеличивается (сначала на ~ 2 мс на вызов, затем на ~ 100 мс и более).У меня три вызова, все демонстрируют одинаковое поведение.
Я загружаю медицинские изображения, и мне нужно, чтобы при этом мой пользовательский интерфейс реагировал, поэтому я использую фонового работника, где я могу загружать и обрабатыватьизображения, но после загрузки их необходимо добавить в пользовательский интерфейс man, чтобы пользователь мог их видеть.
Проблема не возникала, пока я не попытался загрузить исследование, содержащее более 800 изображений.Ранее мои тестовые наборы были ~ 100 изображений, общим размером от 400 МБ до 16 ГБ.Набор задач имеет размер всего 2 ГБ и занимает около 10 минут, чтобы приблизиться к 50%, а набор 16 ГБ загружается всего за ~ 30 с, что исключает общий размер изображения в качестве проблемы.Для справки: моя машина для разработки имеет 32 ГБ оперативной памяти.Я заверил, что это не содержание вызванного метода, закомментировав все это.
Что я хочу понять, так это как возможно, чтобы время, затрачиваемое на вызов, постепенно увеличивалось?Это на самом деле вещь?Мои стеки вызовов не становятся глубже, Количество потоков одинаково, какой ресурс используется, чтобы вызвать это?Чего мне не хватает!?
public void UpdateThumbnailInfo(Thumbnail thumb, ThumbnailInfo info)
{
if (InvokeRequired)
{
var sw = new Stopwatch();
sw.Start();
Invoke((Action<Thumbnail, ThumbnailInfo>) UpdateThumbnailInfo, thumb, info);
Log.Debug("Update Thumbnail Info Timer: {Time} ms - {File}", (int) sw.ElapsedMilliseconds, info.Filename);
}
else
{
// Do stuff here
}
}