如何从Excel互操作事件线程更新GUI控件

本文关键字:线程 更新 GUI 控件 事件 互操作 Excel | 更新日期: 2023-09-27 18:09:11

我有一个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;

我相信互操作库从它创建的线程调用这个事件处理程序。我的问题是,我需要基于此事件更新一些GUI组件,但我不能跨这些线程在GUI上执行更新操作。

我的问题是,从这个excel互操作事件处理程序,我相信是在自己的线程,我怎么能安全地更新我的GUI在线程安全的方式?

我问这个问题是因为我在更新GUI时收到关于跨线程操作的运行时错误,目前。

编辑:我相信链接和建议的可能答案是针对WPF的。我的应用程序不是WPF,它是旧的WinForms。我没有看到Application.Current属性

如何从Excel互操作事件线程更新GUI控件

就用

private void excel_SheetActivate(object activatedSheet)
{
    if (someControl.InvokeRequired)
    {
        someControl.Invoke((WorkbookEvents_SheetActivateEventHandler)excel_SheetActivate, activatedSheet);
    }
    else
    {
        someControl.Text = //...
    }
}

其中someControl是抛出错误的控件,这将检查调用是否必要,如果是,它将在该控件的正确线程上使用相同的参数重新调用相同的函数。