在c#中循环大量图像时计算机冻结 - Wpf

时间:2017-02-10 17:50:47

标签: c# wpf backgroundworker dispatcher

所以我有一个非常简单的软件来调用多图像列表
并以( Next )+( Previous )格式显示它们:

enter image description here

它的作品非常适合我,但当我按住按下按钮快速传递所有项目时,在10或20项之后整个窗口冻结和滞后,一些recherche说使用后台工作者来防止这种情况,所以我试图插入这个:

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

在此内:

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

但仍然会出现同样的问题

如何使其正常工作?
如果还有其他办法,我会很高兴知道它。

1 个答案:

答案 0 :(得分:2)

Dispatcher.Invoke安排在UI线程上执行的委托。您不希望在UI线程上执行任何可能长时间运行的代码,因为这会冻结您的应用程序。

如果你想在后台线程上调用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());

请注意,您无法访问后台线程上的任何UI控件,因此您应该只在后台线程上执行长时间运行的工作,然后如果您想要结果,可以使用ContinueWith方法返回UI线程,例如设置ItemsControl的ItemsSource属性或将Visibility的{​​{1}}属性设置回ProgressBar或其他内容。