我正在尝试在后台线程中预加载程序集,似乎在调用PreLoadAssemblies函数时没有任何事情发生,并且线程已经死了或者什么(但我确实在线程列表中看到了线程)。当我在单线程环境中运行代码时,它运行正常。
这是我创建后台调用的地方:
BackgroundWorker backgroundWorker = new BackgroundWorker();
//[Threaded]
private void InitlaizePoint()
{
backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundInitalization);
backgroundWorker.RunWorkerAsync();
}
这是后台初始化函数。它停止了(意思是没有发生任何事情,我看到我的对话窗口进度条在“空”时运行)我尝试通过PReLoadAssemblies进入后。)
private void BackgroundInitalization(object sender, DoWorkEventArgs e)
{
try
{
PreLoadAssemblies();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
这里是preloadassemblies的样子:
private static void PreLoadAssemblies()
{
//statusController.PublishStatus("pre-loading assemblies");
var missingAssemblies = new ArrayList();
var loadedAssemblies = new ArrayList();
LoadDependencies(Assembly.GetExecutingAssembly().GetName(), missingAssemblies, loadedAssemblies);
}
private static void LoadDependencies(AssemblyName name, ArrayList missingAssemblies, ArrayList loadedAssemblies)
{
try
{
//statusController.PublishStatus("Loading dependencies");
Assembly a = Assembly.Load(name);
loadedAssemblies.Add(name.FullName);
foreach (AssemblyName depends in a.GetReferencedAssemblies())
{
if (!IsAssemblyLoaded(depends.FullName, loadedAssemblies))
LoadDependencies(depends, missingAssemblies, loadedAssemblies);
}
}
catch (Exception)
{
missingAssemblies.Add(name);
}
}
private static bool IsAssemblyLoaded(String name, ArrayList preloadedAssemblies)
{
if (preloadedAssemblies.IndexOf(name) == -1)
return false;
return true;
}
如果您有任何想法,请告诉我。
由于
答案 0 :(得分:3)
你究竟在哪里调用这种方法? BackgroundWorker类需要消息泵已经运行,如果在应用程序中过早地调用它(在Application.Run()之前),它将无法工作。
如果你是在主应用程序启动之前运行的启动画面之类的,不幸的是,你需要自己做线程而不是使用BackgroundWorker。
注意:正如Henk Holterman指出的那样,如果你没有消息泵 (因为你有一个控制台应用程序而不是Winforms或WPF),那么BackgroundWorker根本不会工作在你的应用程序中。
答案 1 :(得分:1)
我们正在查看代码的编辑版本。您删除了导致死锁的位。一些说明:
在您展示代码的未经编辑的版本之前,RunWorkerCompleted是我最好的猜测。
答案 2 :(得分:0)
您无法轻松预装装配件。看看my question。