BackgroundWorker在VSTO中不起作用

我有一名背景工作者。 在我调用worker之前,我禁用了一个按钮并使gif可见。 然后我调用runworkerasync方法,它运行正常,直到comleteion。 在’RunWorkerCompleted()’上,我得到一个跨线程错误。 知道为什么吗?

private void buttonRun_Click(object sender, EventArgs e) { if (comboBoxFiscalYear.SelectedIndex != -1 && !string.IsNullOrEmpty(textBoxFolderLoc.Text)) { try { u = new UpdateDispositionReports( Convert.ToInt32(comboBoxFiscalYear.SelectedItem.ToString()) , textBoxFolderLoc.Text , Properties.Settings.Default.TemplatePath , Properties.Settings.Default.ConnStr); this.buttonRun.Enabled = false; this.pictureBox1.Visible = true; BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(); //backgroundWorker1.RunWorkerAsync(); } catch (Exception ex) { MessageBox.Show("Unable to process.\nError:" + ex.Message, Properties.Settings.Default.AppName); } } } void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { buttonRun.Enabled = true; pictureBox1.Visible = false; } void bw_DoWork(object sender, DoWorkEventArgs e) { u.Execute(); } 

这似乎是VSTO和BackgroundWorker的一个问题。

解决方案就在这里 。

基本上你需要打电话

 System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); 

在调用RunWorkerAsync之前。 效果很好。

每次在AddIn的主类中都有一个静态成员并重用它时,要避免实例化对象。 这样你只需实例化一次。

关于VSTO在与控件相同的线程上运行后台工作程序的事情。 不确定。 我必须检查InvokeRequired

  private void buttonRun_Click(object sender, EventArgs e) { if (comboBoxFiscalYear.SelectedIndex != -1 && !string.IsNullOrEmpty(textBoxFolderLoc.Text)) { try { u = new UpdateDispositionReports( Convert.ToInt32(comboBoxFiscalYear.SelectedItem.ToString()) , textBoxFolderLoc.Text , Properties.Settings.Default.TemplatePath , Properties.Settings.Default.ConnStr); this.buttonRun.Enabled = false; this.pictureBox1.Visible = true; BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(); //backgroundWorker1.RunWorkerAsync(); } catch (Exception ex) { MessageBox.Show("Unable to process.\nError:" + ex.Message, Properties.Settings.Default.AppName); } } } delegate void ReenableRunCallback(); private void ReenableRun() { if (this.buttonRun.InvokeRequired) { ReenableRunCallback r = new ReenableRunCallback(ReenableRun); this.buttonRun.Invoke(r, null); } else this.buttonRun.Enabled = true; } private void HideProgress() { if (this.pictureBox1.InvokeRequired) { ReenableRunCallback r = new ReenableRunCallback(HideProgress); this.pictureBox1.Invoke(r, null); } else this.pictureBox1.Visible = false; } void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { ReenableRun(); HideProgress(); } void bw_DoWork(object sender, DoWorkEventArgs e) { u.Execute(); }