如何从Excel互操作事件线程更新GUI控件?
我有一个C#GUI应用程序,通过官方的互操作COM库自动化一些Excel任务。 我正在为SheetActivate
事件提供我自己的事件处理程序。
// fetch the excel handle var excel = viewer.GetApplication() as Microsoft.Office.Interop.Excel.Application; // set sheet activate event handler excel.SheetActivate += excel_SheetActivate;
我相信互操作库从它创build的线程调用这个事件处理程序。 我的问题是,我需要更新基于这个事件的一些GUI组件,但是我不能在这些线程上的GUI上执行更新操作。
我的问题是,从这个优秀的互操作事件处理程序,我相信是在自己的线程,我怎样才能安全地更新我的graphics用户界面以线程安全的方式?
我问这是因为我目前正在接收更新GUI时有关跨线程操作的运行时错误。
编辑:我相信链接和build议可能的答案是WPF。 我的应用程序不是WPF,它是较早的WinForms。 我没有看到一个Application.Current
属性。
只是使用
private void excel_SheetActivate(object activatedSheet) { if (someControl.InvokeRequired) { someControl.Invoke((WorkbookEvents_SheetActivateEventHandler)excel_SheetActivate, activatedSheet); } else { someControl.Text = //... } }
其中someControl
是someControl
错误的控件,它将检查是否需要调用,如果是,则会在该控件的正确线程上使用相同的参数重新调用相同的函数。