전화하려고 해요 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(() => { ... })
..