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

时间:2016-09-28 16:24:55

标签: c# excel multithreading office-interop

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

只需使用

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

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