【发布时间】:2010-11-02 15:00:34
【问题描述】:
我正在尝试在后台线程中预加载程序集,并且似乎在调用 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());
}
}
这是预加载程序集的样子:
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;
}
如果您有任何想法,请告诉我。
谢谢
【问题讨论】:
-
PreLoadAssemblies方法是什么? -
两个问题:您是否检查过 InitlaizePoint 方法是否被调用过?你有没有在 DoWork 方法的 try 行设置断点,以确保 DoWork 方法被完全调用?设置本身看起来不错。
-
预加载程序集基本上是将所有引用的程序集预加载到内存中。
-
这并没有告诉我们什么。进度条从哪里来?
标签: c# multithreading backgroundworker