【发布时间】:2017-05-20 01:22:50
【问题描述】:
我正在为 excel 开发一个 VSTO 插件,我已经部署了一个后台工作人员来完成一些任务。一旦后台工作人员完成它的执行,我需要更新工作表上的一些内容。 一旦后台工作人员完成其任务,我将使用后台 RunworkerCompleted 事件来执行此任务。根据以下帖子:
提到如果在 UI 线程上创建了 BackgroundWorker,则会在 UI 线程上触发 Background RunworkerCompleted 事件。我已经在插件提供的 VSTA_Main 线程上部署了我的后台工作线程,但与之关联的后台 RunworkerCompleted 事件在任意工作线程上被触发。我对这个问题有以下疑问:
VSTA_Main 线程与 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。
【问题讨论】:
-
你能显示你启动它的代码吗?开始和结束时的线程ID是多少?
-
嗨帕特里克,刚刚添加了代码:)
-
线程 ID 随每次运行而变化。最初,代码在调用后台工作线程的 VSTA_Main 线程上运行。后台工作人员任务完成后的后台 RunworkerCompleted 事件随后在不同的工作线程(不是 VSTA_Main 和后台工作线程)上触发。这 3 个线程的线程 id 在不同的运行中是不同的
标签: c# multithreading vsto backgroundworker synchronizationcontext