C# 未在VSTA_主线程上触发后台RunworkerCompleted事件:Excel VSTO加载项

C# 未在VSTA_主线程上触发后台RunworkerCompleted事件:Excel VSTO加载项,c#,multithreading,vsto,backgroundworker,synchronizationcontext,C#,Multithreading,Vsto,Backgroundworker,Synchronizationcontext,我正在开发一个VSTO加载项for excel,其中部署了一个后台工作程序来执行一些任务。我需要在后台工作人员完成练习后更新工作表上的一些内容。 在后台工作程序完成其任务后,我将使用后台RunworkerCompleted事件来执行此任务。根据以下帖子: 需要指出的是,如果BackgroundWorker是在UI线程上创建的,则会在UI线程上激发后台RunworkerCompleted事件。我已在加载项提供的VSTA_主线程上部署了后台工作线程,但与之关联的后台RunworkerComp

我正在开发一个VSTO加载项for excel,其中部署了一个后台工作程序来执行一些任务。我需要在后台工作人员完成练习后更新工作表上的一些内容。 在后台工作程序完成其任务后,我将使用后台RunworkerCompleted事件来执行此任务。根据以下帖子:

需要指出的是,如果BackgroundWorker是在UI线程上创建的,则会在UI线程上激发后台RunworkerCompleted事件。我已在加载项提供的VSTA_主线程上部署了后台工作线程,但与之关联的后台RunworkerCompleted事件在任意工作线程上被触发。我对这个问题有以下疑问:

  • VSTA_主线程与excel的UI线程不同吗?(我想是的,但我只是想确认一下)

  • 如何使用synchronizationcontext(或任何其他可能的方法)管理线程部署,以便在所需线程上触发后台RunworkerCompleted事件

  • 本例中的简化代码如下所示:

    // This code piece executes on VSTA_Main thread 
    
    private BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
    backgroundWorker.RunWorkerAsync();
    
    
    // This code piece executes on some random worker thread - Assume Thread 1
    
    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // It simulates some task
        Thread.sleep(100) 
    }
    
    
    // This event is raised on a random worker thread - Not Thread 1 and not VSTA_Main
    
    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // perform some sheet update operations
    }
    
    我目前正在使用Microsoft Visual Studio 2010和Microsoft Excel 2007

  • VSTA_主线程与excel的UI线程不同吗?(我想是的,但我只是想确认一下)
  • 我不确定这一点(我通过谷歌搜索VSTA_Main发现了这个问题),但据我所知,访问VSTO加载项中的UI元素必须在这个
    VSTA_Main
    线程上完成

  • 如何使用synchronizationcontext(或任何其他可能的方法)管理线程部署,以便在所需线程上触发后台RunworkerCompleted事件
  • 这似乎是VSTO中的一个错误,这里有一个解决方法:

  • VSTA_主线程与excel的UI线程不同吗?(我想是的,但我只是想确认一下)
  • 我不确定这一点(我通过谷歌搜索VSTA_Main发现了这个问题),但据我所知,访问VSTO加载项中的UI元素必须在这个
    VSTA_Main
    线程上完成

  • 如何使用synchronizationcontext(或任何其他可能的方法)管理线程部署,以便在所需线程上触发后台RunworkerCompleted事件

  • 这似乎是VSTO中的一个错误,这里有一个解决方法:。

    能否显示启动它的代码?开始和结束时的线程ID是什么?嗨,Patrick,刚刚添加了代码:)线程ID随每次运行而变化。最初,代码在调用后台工作线程的VSTA_主线程上运行。后台工作线程任务完成后的后台RunworkerCompleted事件将在另一个工作线程(不是VSTA_Main,也不是后台工作线程)上触发。这3个线程的线程ID在不同的runsCan中是不同的。是否显示启动它的代码?开始和结束时的线程ID是什么?嗨,Patrick,刚刚添加了代码:)线程ID随每次运行而变化。最初,代码在调用后台工作线程的VSTA_主线程上运行。后台工作线程任务完成后的后台RunworkerCompleted事件将在另一个工作线程(不是VSTA_Main,也不是后台工作线程)上触发。这3个线程的线程ID在不同的运行中是不同的