【问题标题】:How to update GUI controls from an Excel interop event thread?如何从 Excel 互操作事件线程更新 GUI 控件?
【发布时间】:2016-09-28 16:24:55
【问题描述】:

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

【问题讨论】:

  • 感谢您的链接。这似乎确实为我指明了正确的方向,但这些答案似乎是针对 WPF 的。我正在使用较旧的 WinForms。我没有看到 Application.Current 属性。
  • @Ryan 只需使用引发错误的控件中的someControl.Invoke(,它将在该控件的正确线程上调用代码。
  • 好吧,明白了。谢谢!
  • 将我的评论转为完整答案。

标签: c# excel multithreading office-interop


【解决方案1】:

随便用

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多