BackgroundWorker未被调用

时间:2010-11-02 15:00:34

标签: c# multithreading backgroundworker

我正在尝试在后台线程中预加载程序集,似乎在调用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;
}

如果您有任何想法,请告诉我。

由于

3 个答案:

答案 0 :(得分:3)

你究竟在哪里调用这种方法? BackgroundWorker类需要消息泵已经运行,如果在应用程序中过早地调用它(在Application.Run()之前),它将无法工作。

如果你是在主应用程序启动之前运行的启动画面之类的,不幸的是,你需要自己做线程而不是使用BackgroundWorker。

注意:正如Henk Holterman指出的那样,如果你没有消息泵 (因为你有一个控制台应用程序而不是Winforms或WPF),那么BackgroundWorker根本不会工作在你的应用程序中。

答案 1 :(得分:1)

我们正在查看代码的编辑版本。您删除了导致死锁的位。一些说明:

  • 您提到了“状态进度条”,但您的代码没有显示任何证据。更新该栏提供了充分的死锁方法。
  • 对PublishStatus的评论调用是一个红旗
  • 没有证据表明RunWorkerCompleted事件处理程序即使你需要一个让你的启动屏幕关闭。当您的主要线程在BGW上阻塞而不是消息时,BGW将会死锁
  • 在程序集之间存在循环依赖关系。您的代码将无限循环。使用Build + Clean,Build + Build进行诊断。
  • 远程,但是几个.NET程序集以及C ++ / CLI程序集都有一个模块初始化程序。当程序集加载到非STA工作线程上时,它可能不一定正常。

在您展示代码的未经编辑的版本之前,RunWorkerCompleted是我最好的猜测。

答案 2 :(得分:0)

您无法轻松预装装配件。看看my question