2016-09-28 74 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是引發錯誤,將檢查,看是否有調用是必要的控制,如果是它會重新調用具有相同的功能相同在該控件的正確線程上的參數。