programing

발송인.호출 시작: 람다를 시스템으로 변환할 수 없습니다.위임

sourcejob 2023. 5. 9. 22:36
반응형

발송인.호출 시작: 람다를 시스템으로 변환할 수 없습니다.위임

전화하려고 합니다.System.Windows.Threading.Dispatcher.BeginInvoke메서드의 시그니처는 다음과 같습니다.

BeginInvoke(Delegate method, params object[] args)

대리자를 만드는 대신 람다를 전달하려고 합니다.

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

컴파일러 오류가 발생했습니다.

람다를 시스템으로 변환할 수 없습니다.위임합니다.

위임자의 서명은 개체를 매개 변수로 사용하고 void를 반환합니다.제 람다는 이것과 일치하지만, 작동하지 않습니다.제가 무엇을 빠뜨리고 있나요?

단축:

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

이 방법은 시스템을 사용하기 때문입니다.대리인, 대리인에게 특정 유형의 대리인을 지정해야 하며, 그렇게 선언해야 합니다.이 작업은 캐스트를 통해 수행하거나 새 딜러를 통해 지정된 딜러를 생성하여 수행할 수 있습니다.다음과 같이 입력합니다.

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

또한, SLaks가 지적했듯이, Dispatcher.BeginInvoke는 매개 변수 배열을 사용하므로 다음과 같이 쓸 수 있습니다.

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

또는 DoSomething이 이 개체 자체의 메서드인 경우:

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

인라인 람다 사용 중...

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

시스템을 참조하는 경우.창문들.프로젝트의 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(() => { ... }).

언급URL : https://stackoverflow.com/questions/4936459/dispatcher-begininvoke-cannot-convert-lambda-to-system-delegate

반응형