我正在为excel开发一个VSTO-addin,我已经部署了一个后台工作人员来执行某项任务。一旦后台工作人员完成它,我需要更新工作表上的一些内容。 一旦后台工作人员完成其任务,我正在使用Background RunworkerCompleted Event来执行此任务。根据以下帖子:
如果在UI线程上创建了BackgroundWorker,则会在UI线程上触发Background RunworkerCompleted Event。我已经在addin提供的VSTA_Main线程上部署了我的后台工作程序,但与之关联的Background RunworkerCompleted事件在任意工作线程上被触发。我对这个问题有疑问:
VSTA_Main线程是否与excel的UI线程不同? (我认为是,但我只想确认)
如何使用 synchronizationcontext (或任何其他可能的方法)管理线程部署,以便在所需的线程上触发Background 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。
答案 0 :(得分:0)
- VSTA_Main线程是否与excel的UI线程不同? (我认为是,但我只想确认)
醇>
我不确定(我通过Google搜索 VSTA_Main 找到了这个问题)但是根据我的理解,访问VSTO插件中的UI元素必须在这个VSTA_Main
线程上完成。
- 如何使用synchronizationcontext(或任何其他可能的方法)管理线程部署,以便在所需的线程上触发Background RunworkerCompleted事件。
醇>
这似乎是VSTO中的一个错误,这是一个解决方法:BackgroundWorker Not working in VSTO。