我有一个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
属性。
答案 0 :(得分:1)
只需使用
private void excel_SheetActivate(object activatedSheet)
{
if (someControl.InvokeRequired)
{
someControl.Invoke((WorkbookEvents_SheetActivateEventHandler)excel_SheetActivate, activatedSheet);
}
else
{
someControl.Text = //...
}
}
其中someControl
是抛出错误的控件,它将检查是否需要调用,如果是,它将在正确的线程上使用相同的参数重新调用相同的函数控制权。