C# BeginInvoke问题

6

为什么会出现这个错误,如何修复它。谢谢帮助。

错误 4:无法将 lambda 表达式转换为类型“System.Delegate”,因为它不是委托类型。

    void provider_GetAssignmentsComplete(object sender, QP_Truck_Model.Providers.GetAssignmentsEventArgs e) {
        lvMyAssignments.Dispatcher.BeginInvoke(() =>
        {
            lvMyAssignments.ItemsSource = e.HandOverDocs;
        });
    }

最好使用Task调度或SynchronizationContext,而不是Dispatcher,这样您的BLL代码就不会与WPF / Silverlight绑定。 - Stephen Cleary
2个回答

10

在某些情况下,Lambda表达式不能隐式转换为委托。特别是,如果该方法期望类型 Delegate,则必须首先显式地将Lambda表达式转换为委托,以便编译器接受它。

可以做的是显式地将Lambda表达式强制转换,这应该允许您使用 BeginInvoke

lvMyAssignments.Dispatcher.BeginInvoke( (Action)(() => 
        { 
            lvMyAssignments.ItemsSource = e.HandOverDocs; 
        })); 

通常情况下,如果你有一个带有强类型委托签名的方法,例如:

public static void BeginInvoke( Action d ) { ... }

编译器可以将 lambda 表达式转换为所需的委托签名。但如果该方法是松散类型的:

public static void BeginInvoke( Delegate d ) { ... }

编译器不会接受一个 lambda 表达式。但是,你可以将 lambda 表达式强制转换为特定的委托签名(比如 Action),然后将其传递给方法。编译器不能自动地为你完成这个操作,因为有许多不同的委托类型可以与 lambda 的签名匹配...编译器无法知道哪个是正确的。


3
将其转换为委托对象,例如Action
lvMyAssignments.Dispatcher.BeginInvoke((Action)(() => lvMyAssignments.ItemsSource = e.HandOverDocs)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接