2016-09-28 56 views
0

我已经得到了通过官官互操作COM库自动执行一些Excel的任务的C#GUI应用程序。我为事件提供了自己的事件处理程序。如何从Excel互操作事件线程更新GUI控件?

// 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属性。

+0

请参阅:http://stackoverflow.com/questions/9732709/the-calling-thread-cannot-access-this-object-because-a-different-thread-owns-it – PaulF

+0

感谢您的链接。这似乎确实指向了正确的方向,但这些答案似乎适用于WPF。我正在使用较旧的WinForms。我没有看到一个'Application.Current'属性。 – Ryan

+0

@Ryan只是使用'someControl.Invoke('从抛出错误的控制,将调用在该控件的正确线程上的代码。 –

回答

1

只需使用

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

其中someControl是引发错误,将检查,看是否有调用是必要的控制,如果是它会重新调用具有相同的功能相同在该控件的正确线程上的参数。