2015-04-14 49 views
1

我有一些菜單彈出動作按鈕。這是彈出式的,所以它是在新線程中創建的。我添加事件創建的按鈕是這樣的:多線程 - 如何調用動作

private StdProcedure m_ToInvoke; 

public void AddButton() 
{ 
    Button myChildTempButton = new Button(); 
    myChildTempButton.ItemClick += new ItemClickEventHandler((x, y) => 
    { 
     HidePopup(); m_ToInvoke = myOpp.Procedure; 
    }); 
} 

StdProcedure是委託

public delegate void StdProcedure(); 

,並關閉事件之後:

protected override void OnPopupClosed() 
{ 
    base.OnPopupClosed(); 
    if (m_ToInvoke != null) m_ToInvoke.Invoke(); 
} 

這並不正常工作。有時調用操作停止了我的另一個線程,我不明白它是如何工作的。

我的問題是什麼是之間的不同:

m_ToInvoke() 
m_ToInvoke.Invoke() 
m_ToInvoke.BeginInvoke() 
m_ToInvoke.DynamicInvoke() 

,我應該在這裏使用?

對我來說第一和第二個效果是一樣的。

回答

1
  • m_ToInvoke()僅僅是C#爲m_ToInvoke.Invoke()
  • m_ToInvoke.Invoke()語法糖同步執行委託,在同一個線程
  • m_ToInvoke.BeginInvoke()時間表委託在線程池中的線程調用;返回的IAsyncResult可用於等待它完成,並且還可以傳入回調
  • m_ToInvoke.DynamicInvoke()是這些方法中唯一要由Delegate聲明的方法 - 類似於通過反射調用它,因爲沒有編譯時安全性的數量/類型的參數等

注意,在委託調用Invoke/BeginInvoke是調用Dispatcher.Invoke/BeginInvokeControl.Invoke/BeginInvoke,這是非常不同與UI線程中調用委託做對於WPF/WinForms應用程序 - 雖然再次,Invoke版本是同步的,BeginInvoke是異步的。