c# - VSTO - 在异步 BackgroundWorker 运行时禁用 Excel
问题描述
我有一个正在为 Excel 开发的 VSTO 加载项。表单允许用户从数据库中查询表,然后进行适当的填充。Bellow 是我为 BackGround Worker 编写的代码,您可以看到它运行异步并完美地报告进度。
我的问题是,在进程运行时,用户能够在 Excel 中进行操作和单击。我知道这是异步函数的重点,但在这种情况下,它会导致 BackgroundWorker 被中断。有没有办法完全禁用点击或活动工作表?
private void button1_Click(object sender, EventArgs e)
{
//run
//this.backgroundWorker3.RunWorkerAsync();
System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker3_ProgressChanged);
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker3_DoWork);
bw.RunWorkerAsync();
}
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker3_WorkerCOmpleted);
if (!_isExtended)
{
oneline ol = new oneline();
ol.buildOneline(this._wheres,worker );
}
else
{
ExtendedOneline ole = new ExtendedOneline();
ole.buildExtendedOneline(this._wheres,worker);
}
//worker.ReportProgress();
e.Result = "COMPLETE!";
}
解决方案
请注意,VSTO 中的多线程通常不是一个好主意。但是,我使用进度对话框取得了成功(我从这个对话框开始)。您仍然只运行一个与 API 交互的线程,所以据我所知没关系。
你这样称呼它:
ProgressDialogResult result = ProgressDialog.Execute(parent, name, () =>
{
// do whatever
}, new ProgressDialogSettings(true, true, false));
您也可以使用WdProtectionType
暂时禁用编辑(这适用于 Word,但我想 Excel 有类似的东西,也许是 XlProtectionType?)但我不推荐它。
推荐阅读
- c# - C# Type.GetFields 基于环境的不同顺序
- ngrx - NgRx 如何从另一个模块启动功能模块
- amazon-web-services - OpenVPN 客户端到 SSH 到 EC2 私有实例
- angular - 仅当输入可见时才激活角度验证器
- nginx - Nginx 用 proxy_pass 重写
- reactjs - React 三元运算符防止使用样式化组件重复代码?
- python - 从数组中获取日期范围
- java - 无法通过 java/selenium 的文本文件获取多个用户名和密码
- cassandra - 在哪个列上创建布隆过滤器 - cassandra
- python - Python Selenium 点击打开 Chrome 打印对话框挂起