在线程中执行的Assembly.Load,阻止ui [英] Assembly.Load executed in Thread, blocks ui

查看:69
本文介绍了在线程中执行的Assembly.Load,阻止ui的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用"   Thread(   ThreadStart(tstest)).Start();" 在装配体加载时冻结UI

Executing the folowing code with "new Thread(new ThreadStart(tstest)).Start();" Freezes the UI while the Assemblys are Loading

如何防止UI冻结?

void tstest()
{
foreach(var item in GetAsembys("folder with a lot *.exe files"))
{
}
}

    public class AssemblyHolder
    {

        #region Fields

        public Assembly originAssembly;

        public String originPath;

        private FileVersionInfo m_FileVersion;

        private Version m_AssemblyVersion;

        #endregion Fields

        #region Properties

        public FileVersionInfo FileVersion { get { return m_FileVersion = m_FileVersion ?? GetFileVersion(); } set { m_FileVersion = value; } }
        public Version AssemblyVersion { get { return m_AssemblyVersion = m_AssemblyVersion ?? GetAssemblyVersion(); } set { m_AssemblyVersion = value; } }

        #endregion Properties

        #region Constructors

        public AssemblyHolder(Assembly _asm, String _originPath)
        {
            originAssembly = _asm;
            originPath = _originPath;
        }

        #endregion Constructors

        #region Methods

        public static implicit operator Assembly(AssemblyHolder d)
        {
            return d.originAssembly;
        }

        public FileVersionInfo GetFileVersion()
        {
            return FileVersionInfo.GetVersionInfo(originPath);
        }

        private Version GetAssemblyVersion()
        {
            return originAssembly.GetName().Version;
        }

        #endregion Methods
    }

   public static List<AssemblyHolder> GetAsembys(String _rootfolder, SearchOption _option = SearchOption.AllDirectories)
        {
            try
            {
                List<AssemblyHolder> asm = new List<AssemblyHolder>();
                var executables = Directory.GetFiles(_rootfolder, "*.exe", _option);

                foreach (var item in executables)
                    try
                    {
                        using (Stream stream = File.OpenRead(item))
                        {
                            byte[] rawAssembly = new byte[stream.Length];
                            stream.Read(rawAssembly, 0, (int)stream.Length);
                            asm.Add(new AssemblyHolder(Assembly.Load(rawAssembly), item));
                        }
                    }
                    catch { }

                return asm;
            }
            catch { return default(List<AssemblyHolder>); }
        }

推荐答案


你好,Robin4444,


Hi Robin4444,

根据您的描述,我建议您可以尝试以下建议.

From your description, I suggest you can try the following suggestion.

您可以使用async/await执行tstest方法.

You can use async/await to execute your tstest method.

您可以参考以下链接.

等待和UI,以及僵局:

最好的问候,

Yohann Lu

Yohann Lu


这篇关于在线程中执行的Assembly.Load,阻止ui的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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