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

How to update GUI controls from an Excel interop event thread?

我有一个 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 属性.

只需使用

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

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