Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用BackgroundWorker_C#_Multithreading_Backgroundworker - Fatal编程技术网

C# 未调用BackgroundWorker

C# 未调用BackgroundWorker,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我试图在后台线程中预加载程序集,当调用preload assemblies函数时,似乎什么都没有发生,就像线程已经死了一样(但我确实在threads列表中看到了线程)。当我在单线程环境中运行代码时,它工作正常 下面是我创建后台调用的地方: BackgroundWorker backgroundWorker = new BackgroundWorker(); //[Threaded] private void InitlaizePoint() { backgroundWorker

我试图在后台线程中预加载程序集,当调用preload assemblies函数时,似乎什么都没有发生,就像线程已经死了一样(但我确实在threads列表中看到了线程)。当我在单线程环境中运行代码时,它工作正常

下面是我创建后台调用的地方:

 BackgroundWorker backgroundWorker = new BackgroundWorker();
 //[Threaded]
 private void InitlaizePoint()
 {
     backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundInitalization);
     backgroundWorker.RunWorkerAsync();          
 }
下面是后台初始化函数。在我尝试通过预加载程序集进入后,它停止了(意味着什么也没有发生,我看到我的对话框窗口进度栏“空着”运行)

以下是预加载程序集的外观:

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;
}
如果你有任何想法,请告诉我


谢谢

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

不幸的是,如果您是在主应用程序启动之前运行的启动屏幕上执行此操作,那么您将需要自己执行线程,而不是使用BackgroundWorker


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

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

  • 您提到了一个“状态进度条”,但您的代码没有显示它的证据。更新该条为死锁提供了很多方法
  • 对PublishStatus的已注释调用是一个危险信号
  • 没有证据表明存在RunWorkerCompleted事件处理程序,即使您需要一个来关闭启动屏幕。当主线程在BGW上阻塞并且没有传输消息时,BGW将死锁
  • 对于程序集之间的循环依赖关系,存在一种特殊情况。您的代码将挂起在一个无休止的循环中。使用构建+清理、构建+构建进行诊断
  • 远程,但有几个.NET程序集以及C++/CLI程序集具有模块初始值设定项。当部件加载到非STA工作线程上时,它可能不一定正常工作

RunWorkerCompleted是我的最佳猜测,直到您显示代码的未编辑版本。

您无法如此轻松地预加载程序集。看看。

什么是
preload assemblies
方法?两个问题:您是否检查过是否调用过InitlaizePoint方法?您是否在DoWork方法的try行上放置了断点以确保DoWork方法被调用?安装本身看起来很好。预加载程序集基本上是将所有引用的程序集预加载到内存中。这没有告诉我们什么。progressbar从何而来?是的,我确实在主应用程序启动之前运行的启动屏幕上调用它,但是为什么后台工作程序不能工作呢?即使我使用自己的线程,它也不起作用。我很难找到我读到的地方,但是BackgroundWorker是专门设计用于WinForms应用程序中的UI线程的。我猜它使用消息循环将其事件与UI线程进行通信。所以,在Application.Run()之前,可能会创建它,但从未收到启动的信号。使用System.Threading.Thread而不是BackgroundWorker可能是最好的选择。
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;
}