后台RunworkerCompleted事件未在VSTA_Main上触发线程:Excel VSTO Addin

时间:2017-01-05 13:13:45

标签: c# multithreading vsto backgroundworker synchronizationcontext

我正在为excel开发一个VSTO-addin,我已经部署了一个后台工作人员来执行某项任务。一旦后台工作人员完成它,我需要更新工作表上的一些内容。 一旦后台工作人员完成其任务,我正在使用Background RunworkerCompleted Event来执行此任务。根据以下帖子:

如果在UI线程上创建了BackgroundWorker,则会在UI线程上触发Background RunworkerCompleted Event。我已经在addin提供的VSTA_Main线程上部署了我的后台工作程序,但与之关联的Background RunworkerCompleted事件在任意工作线程上被触发。我对这个问题有疑问:

  1. VSTA_Main线程是否与excel的UI线程不同? (我认为是,但我只想确认)

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

  3. 我案例中的简化代码如下所示:

    // 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。

1 个答案:

答案 0 :(得分:0)

  
      
  1. VSTA_Main线程是否与excel的UI线程不同? (我认为是,但我只想确认)
  2.   

我不确定(我通过Google搜索 VSTA_Main 找到了这个问题)但是根据我的理解,访问VSTO插件中的UI元素必须在这个VSTA_Main线程上完成。

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

这似乎是VSTO中的一个错误,这是一个解决方法:BackgroundWorker Not working in VSTO