[c#] Invoke調用中的匿名方法


Answers

其實你不需要使用委託關鍵字。 只需傳遞lambda作為參數:

control.Invoke((MethodInvoker)(() => {this.Text = "Hi"; }));
Question

對於我們想要在Control.Invoke中匿名調用委託的語法有點麻煩。

我們嘗試了許多不同的方法,都無濟於事。

例如:

myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); }); 

someParameter是本地方法

以上將導致編譯器錯誤:

無法將匿名方法轉換為鍵入'System.Delegate',因為它不是委託類型




我對其他建議​​有問題,因為我有時想從我的方法中返回值。 如果您嘗試使用帶有返回值的MethodInvoker,它似乎並不喜歡它。 所以我使用的解決方案就是這樣(非常高興聽到一種更簡潔的方法 - 我使用的是c#.net 2.0):

    // Create delegates for the different return types needed.
    private delegate void VoidDelegate();
    private delegate Boolean ReturnBooleanDelegate();
    private delegate Hashtable ReturnHashtableDelegate();

    // Now use the delegates and the delegate() keyword to create 
    // an anonymous method as required

    // Here a case where there's no value returned:
    public void SetTitle(string title)
    {
        myWindow.Invoke(new VoidDelegate(delegate()
        {
            myWindow.Text = title;
        }));
    }

    // Here's an example of a value being returned
    public Hashtable CurrentlyLoadedDocs()
    {
        return (Hashtable)myWindow.Invoke(new ReturnHashtableDelegate(delegate()
        {
            return myWindow.CurrentlyLoadedDocs;
        }));
    }



您需要創建一個委託類型。 匿名方法創建中的關鍵字'委託'有點令人誤解。 您不是創建匿名委託,而是創建匿名方法。 您創建的方法可用於委託中。 喜歡這個:

myControl.Invoke(new MethodInvoker(delegate() { (MyMethod(this, new MyEventArgs(someParameter)); }));



Links