[c#] Invoke 호출의 익명 메소드



2 Answers

사실 대리자 키워드를 사용할 필요가 없습니다. 그냥 매개 변수로 람다 전달 :

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

우리가 Control.Invoke 내에서 익명으로 대리자를 호출하려는 구문에 약간의 문제가 있습니다.

우리는 여러 가지 접근법을 시도했지만 모두 쓸모가 없습니다.

예 :

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

someParameter가이 메소드에 대해 로컬 인 경우

위의 경우 컴파일러 오류가 발생합니다.

익명 메서드를 대리자 형식이 아니기 때문에 'System.Delegate'형식으로 변환 할 수 없습니다.




대리자 형식을 만들어야합니다. 익명 메소드 생성에서 'delegate'키워드는 약간 오도 된 것입니다. 익명의 대리자를 만드는 것이 아니라 익명의 메서드를 만드는 것입니다. 만든 메서드는 대리자에서 사용할 수 있습니다. 이렇게 :

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



나는 때때로 내 메서드에서 값을 반환하기 때문에 다른 제안에 문제가있었습니다. 반환 값으로 MethodInvoker를 사용하려고 시도하면 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;
        }));
    }





Related