在线程中执行的Assembly.Load,阻止ui [英] Assembly.Load executed in Thread, blocks ui
本文介绍了在线程中执行的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.
您可以参考以下链接.
最好的问候,
Yohann Lu
Yohann Lu
这篇关于在线程中执行的Assembly.Load,阻止ui的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文