2017-02-10 4 views
-1

Так у меня есть очень простое программное обеспечение для вызова Multi Image списка
и показать их в формате (Next) + (Previous), как это :Компьютер замирает, когда зацикливание большого списка изображений в C# - Wpf

enter image description here

и его работа отлично подходит для меня, но когда я Держите на кнопку (NEXT), чтобы пройти все пункты быстрого, после 10 или 20 пункта в все окно замерзает и Лаг, некоторые отборное говорит использовать фоновую работнику, чтобы предотвратить это, так что я попытался вставить это:

var getImage = Directory.EnumerateFiles(DirName, Ext, 
SearchOption.TopDirectoryOnly); 

внутри этого:

Dispatcher.Invoke(DispatcherPriority.Background, 
    new Action(() => /*### the Images output Here ###*/)); 

но то же самое Вопросы, которые все еще случаются

как заставить его работать правильно?
, и если есть какой-либо другой способ сделать это, я буду рад узнать об этом.

+1

Dispatcher.Invoke расставляет делегат для выполнения в потоке пользовательского интерфейса. Вы не хотите выполнять какой-либо потенциально долговременный код в потоке пользовательского интерфейса. Почему вы пытаетесь это сделать? – mm8

+0

@ mm8 Я думал, что это будет лучше, чем «BackgroundWorker worker = new BackgroundWorker();», но у меня просто недостаточно знаний о диспетчере и «BackgroundWorker», вот почему я спрашиваю :) и если есть другой способ избежать отставание, когда я вызываю свои изображения, вы можете поделиться с нами :), это платформа знаний, и мы здесь для этого. –

+2

Вы должны выполнить любую длительную операцию в фоновом потоке, но имейте в виду, что вы можете получать доступ только к элементам пользовательского интерфейса в потоке пользовательского интерфейса. Пожалуйста, обратитесь к моему ответу за дополнительной информацией. – mm8

ответ

2

Dispatcher.Invoke Планирует выполнение делегата в потоке пользовательского интерфейса. Вы не хотите выполнять какой-либо потенциально долговременный код в потоке пользовательского интерфейса, поскольку это то, что замерзает ваше приложение.

Если вы хотите, чтобы вызвать Directory.EnumerateFiles на фоне поток можно запустить задачу:

Task.Factory.StartNew(()=> 
{ 
    //get the files on a background thread... 
    return Directory.EnumerateFiles(DirName, Ext, SearchOption.TopDirectoryOnly); 
}).ContinueWith(task => 
{ 
    //this code runs back on the UI thread 
    IEnumerable<string> theFiles = task.Result; //... 
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 

Заметьте, что вы не можете получить доступ к какому-либо контролю пользовательского интерфейса в фоновом потоке, хотя, так что вы должны выполнять только затянувшуюся работайте над фоновым потоком, а затем вы можете использовать метод ContinueWith, если вы хотите что-то с результатами вернуться к потоку пользовательского интерфейса, например, установив свойство ItemsSource элемента ItemsControl или установив свойство Visibilityна Collapsed или что-то ,

+0

спасибо, что дал мой предварительный просмотр больше скорости и лагга было уменьшено, но окно все еще замерзает после того, как удерживается * кнопка «Далее» * долгое время: /, Я думаю, что это может привести к тому, что изображения будут сохранены на «Thumbs.db» в (% Temp%) после их показа, чтобы изображения не нужно пересчитывать каждый раз, когда Программное обеспечение просматривает их, что вы думать ?. –

+0

Почему downvote? Все, что вы делаете в потоке пользовательского интерфейса, сделает ваше приложение менее отзывчивым, так как оно не может реагировать на такие события, как движения мыши и нажатия кнопок, а также выполнять собственный код одновременно. Таким образом, вам нужно либо вызывать обработчик события клика реже, выгружать любую работу, которую он выполняет, в фоновый поток, или как-то ускорять его. Нет ярлыков. – mm8

Смежные вопросы