[c#] Dispatcher.BeginInvoke : 람다를 System.Delegate로 변환 할 수 없습니다.

전화하려고 해요 System.Windows.Threading.Dispatcher.BeginInvoke. 메서드의 서명은 다음과 같습니다.

BeginInvoke(Delegate method, params object[] args)

대리인을 생성하는 대신 Lambda를 전달하려고합니다.

_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );

그것은 나에게 컴파일러 오류를 준다.

람다를 System.Delegate로 변환 할 수 없습니다.

대리자의 서명은 개체를 매개 변수로 사용하고 void를 반환합니다. 내 람다는 이것과 일치하지만 작동하지 않습니다. 내가 무엇을 놓치고 있습니까?



답변

이 메서드는 System.Delegate 를 사용하므로 선언 된 특정 유형의 대리자를 제공해야합니다. 이는 다음과 같이 새 DelegateType을 통해 지정된 델리게이트를 생성하거나 캐스트를 통해 수행 할 수 있습니다.

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     new object[] { this }
  );

또한 SLaks가 지적했듯이 Dispatcher.BeginInvoke 는 params 배열을 사용하므로 다음과 같이 작성할 수 있습니다.

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     this
  );

또는 DoSomething이이 개체 자체에 대한 메서드 인 경우 :

_dispatcher.BeginInvoke(new Action(this.DoSomething));


답변

짧게 :

_dispatcher.BeginInvoke((Action)(() => DoSomething()));


답변

인라인 Lambda 사용 …

Dispatcher.BeginInvoke((Action)(()=>{
  //Write Code Here
}));


답변

프로젝트에서 System.Windows.Presentation.dll을 참조하고 추가 using System.Windows.Threading하면 람다 구문을 사용할 수있는 확장 메서드에 액세스 할 수 있습니다.

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});


답변

이를 위해 확장 메서드를 만듭니다. 예

public static void BeginInvoke(this Control control, Action action)
    => control.BeginInvoke(action);

이제 형식 내에서 호출 할 수 있습니다 this.BeginInvoke(() => { ... })..


답변