当后台线程运行LINQ时,WPF UI冻结 [英] WPF UI freezes when background thread runs LINQ
本文介绍了当后台线程运行LINQ时,WPF UI冻结的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
UI有一个加载微调器。在下面的数据加载期间,UI是响应的。在LINQ期间,它冻结了。计算机有8个核心。
public async static 任务加载()
{
if (_loader == null )
{
_loader = Task.Run(()= >
{
使用( var ta = < span class =code-keyword> new PostformDbTableAdapters.coloursTableAdapter())
Colors = ta.GetData();
使用( var ta = new PostformDbTableAdapters.finishesTableAdapter())
Finishes = ta.GetData( );
使用( var ta = new PostformDbTableAdapters.image_metaTableAdapter())
ImageMeta = ta.GetData();
使用( var ta = new PostformDbTableAdapters.laminate_appearancesTableAdapter())
LaminateAppearances = ta.GetData();
使用( var ta = new PostformDbTableAdapters.laminate_finishesTableAdapter())
LaminateFinishes = ta.GetData();
使用( var ta = new PostformDbTableAdapters.laminatesTableAdapter())
Laminates = ta.GetData();
使用( var ta = new PostformDbTableAdapters.manufacturersTableAdapter())
制造商= ta.GetData();
使用( var ta = new PostformDbTableAdapters.materialsTableAdapter())
Materials = ta.GetData();
使用( var ta = new PostformDbTableAdapters.patternsTableAdapter())
Patterns = ta.GetData();
Swatches = Laminates.Where(lam = > lam.lam_man_id!= 或)。选择(lam = > new Laminate
{
Id = lam.lam_id,
Name = lam.lam_name,
Sku = lam.lam_sku,
Manufacturer = Manufacturers.FindByman_id(lam.lam_man_id ).man_name,
Finishes = LaminateFinishes.Where(lf = > lf.lf_lam_id == lam.lam_id).Select(fin = > Finishes.FindByfin_id(fin.lf_fin_id).fin_code)。ToArray(),
ImageId = lam.Islam_img_idNull()?( int ?) null :lam.lam_img_id
})。AsParallel()。ToList();
_loader = null ;
});
await _loader;
}
else
await _loader;
}
我尝试过使用和不使用 .AsParellel()< LINQ上的/ code>。
如何保持UI响应?
解决方案
如果您有visual studio 2012或更高版本(我认为是.Net Framework 4.5),您可以使用Async关键字 http ://msdn.microsoft.com/en-us/library/hh156513.aspx [ ^ ]
如果不是你最有可能的解决方案就是将linq放在它自己的线程上。 / BLOCKQUOTE>
The UI has a "loading" spinner. During the data loading below, the UI is responsive. During the LINQ, it freezes. The computer has 8 cores.
public async static Task Load() { if (_loader == null) { _loader = Task.Run(() => { using (var ta = new PostformDbTableAdapters.coloursTableAdapter()) Colours = ta.GetData(); using (var ta = new PostformDbTableAdapters.finishesTableAdapter()) Finishes = ta.GetData(); using (var ta = new PostformDbTableAdapters.image_metaTableAdapter()) ImageMeta = ta.GetData(); using (var ta = new PostformDbTableAdapters.laminate_appearancesTableAdapter()) LaminateAppearances = ta.GetData(); using (var ta = new PostformDbTableAdapters.laminate_finishesTableAdapter()) LaminateFinishes = ta.GetData(); using (var ta = new PostformDbTableAdapters.laminatesTableAdapter()) Laminates = ta.GetData(); using (var ta = new PostformDbTableAdapters.manufacturersTableAdapter()) Manufacturers = ta.GetData(); using (var ta = new PostformDbTableAdapters.materialsTableAdapter()) Materials = ta.GetData(); using (var ta = new PostformDbTableAdapters.patternsTableAdapter()) Patterns = ta.GetData(); Swatches = Laminates.Where(lam => lam.lam_man_id != "or").Select( lam => new Laminate { Id = lam.lam_id, Name = lam.lam_name, Sku = lam.lam_sku, Manufacturer = Manufacturers.FindByman_id(lam.lam_man_id).man_name, Finishes = LaminateFinishes.Where(lf => lf.lf_lam_id == lam.lam_id).Select(fin => Finishes.FindByfin_id(fin.lf_fin_id).fin_code).ToArray(), ImageId = lam.Islam_img_idNull() ? (int?)null : lam.lam_img_id }).AsParallel().ToList(); _loader = null; }); await _loader; } else await _loader; }
I've tried with and without.AsParellel()
on the LINQ.
How can I keep the UI responsive?解决方案if you have visual studio 2012 or greater (.Net Framework 4.5 I think) you can use the Async keywords http://msdn.microsoft.com/en-us/library/hh156513.aspx[^]
if not your mostly likely solution will be to put the linq on it's own thread.
这篇关于当后台线程运行LINQ时,WPF UI冻结的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文