wyrażenie lambda nie są niejawnie zamienny do delegatów w niektórych przypadkach. W szczególności, jeśli metoda wymaga typu Delegate
, musisz najpierw wyraźnie rzucić lambdę, aby kompilator ją zaakceptował.
Co można zrobić, to wyraźnie rzutować lambda, co powinno pozwolić na użycie BeginInvoke
:
lvMyAssignments.Dispatcher.BeginInvoke((Action)(() =>
{
lvMyAssignments.ItemsSource = e.HandOverDocs;
}));
Normalnie, jeśli masz metodę z silnie wpisany podpisu delegata takiego:
public static void BeginInvoke(Action d) { ... }
Kompilator może przekonwertować wyrażenie lambda na odpowiedni podpis pełnomocnika. Ale jeśli metoda jest luźno wpisana:
public static void BeginInvoke(Delegate d) { ... }
kompilator nie zaakceptuje lambda. Można jednak rzucić wyrażenie lambda do określonego podpisu delegata (powiedzmy akcji), a następnie przekazać to do metody. Kompilator nie może automatycznie zrobić tego za ciebie, ponieważ istnieje wiele różnych typów delegatów, które mogą być poprawnym dopasowaniem do podpisu lambda ... a kompilator nie ma możliwości sprawdzenia, który z nich jest właściwy.
Lepiej użyć 'Task' harmonogramu lub' SynchronizationContext' zamiast 'Dispatcher', tak że kod BLL nie jest związana z WPF/Silverlight . –