如何从 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
是抛出错误的控件,它将检查是否需要调用,如果需要,它将在正确的位置重新调用具有相同参数的相同函数该控件的线程。
我有一个 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
是抛出错误的控件,它将检查是否需要调用,如果需要,它将在正确的位置重新调用具有相同参数的相同函数该控件的线程。