当后台线程运行LINQ时,WPF UI冻结 [英] WPF UI freezes when background thread runs LINQ

查看:109
本文介绍了当后台线程运行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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆