作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 Excel 工作表上有一个按钮,它启动一个新线程来进行一些处理。如果我想对 Excel 进行任何更改(例如,使用 Worksheet.Range("A1").Value = "info";
将数据写入单元格),我想我必须使用主 UI 线程.
如何做到这一点?
通常在 Winforms 中,我会在控件上调用 Invoke
,但是 Excel.Application
或 Worksheet
或 Range
对象没有 Invoke
方法。
最佳答案
这项工作“不需要”在 UI 线程上完成,.net 会为您整理调用,但如果您从后台线程重复调用,则可能会遇到性能问题。
但要具体回答您的问题,如果您有 .net 3.5,请在加载项加载事件中添加:
Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;
然后添加:
public Dispatcher Dispatcher { get {return _dispatcher;} }
然后你可以通过 go 分派(dispatch)到 UI 线程
Globals.ThisAddIn.Dispatcher.Invoke(()=>{/*stuff*/});
如果您没有 .net 3.5,那么还有一些其他的线程同步技术,例如使用 SynchronizationContext.Current 而不是 Dispatcher。
关于c# - VSTO:在主 Excel 线程上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5567858/
我是一名优秀的程序员,十分优秀!