2009-12-03 18 views
3

使用Timer對象,我可以設置SynchronizingObject屬性以避免在從定時器的事件處理程序更新GUI時不得不使用invoke。如果我有一個類而不是訂閱一個事件並且必須更新事件處理程序中的GUI,是否有類似的概念?還是必須編寫InvokeRequired樣板代碼?SynchronizingObject對於事件

回答

3

SynchronizingObject只是一個ISynchronizeInvoke屬性。 (例如,該接口由WinForms控件實現。)

您可以自己使用相同的接口,但使用vanilla事件無法真正指定同步對象。

什麼你可能做的是寫一個實用的方法,這需要委託和ISynchronizeInvoke,並返回一個代表,這使得確保原委託是正確的線程上運行。

例如:

public static EventHandler<T> Wrap<T>(EventHandler<T> original, 
    ISynchronizeInvoke synchronizingObject) where T : EventArgs 
{ 
    return (object sender, T args) => 
    { 
     if (synchronizingObject.InvokeRequired) 
     { 
      synchronizingObject.Invoke(original, new object[] { sender, args }); 
     } 
     else 
     { 
      original(sender, args); 
     } 
    }; 
} 
+0

這是類適合使用時,我想用一個自定義的類(非的WinForms)同步,如下所示:http://stackoverflow.com/q/10654163/ 328397 – LamonteCristo 2012-05-18 16:25:19

+0

@ makerofthings7:我不認爲這是我在這種情況下使用的方法,不。如果您使用.NET 4,請查看TPL提供的內容。 – 2012-05-18 16:27:49