C#委托和调度程序问题

4

在尝试这个操作时,我遇到了以下错误:

ERROR:需要方法名称。

应该如何纠正这个问题?

delegate void DelegateFillList(DeliveryDoc[] deliveryDocs);
private void FillListViewAssignment(DeliveryDoc[] docs) {
    if(lvMyAssignments.Dispatcher.CheckAccess()) {
        lvMyAssignments.ItemsSource = docs;
        lvAllOngoingAssignments.ItemsSource = docs;

        if(m_tempDeliveryDocs != null) {
            txtblockHandOverCount.Text = m_tempDeliveryDocs.Length.ToString();
        }

    } else {
        lvMyAssignments.Dispatcher.BeginInvoke(
            new DelegateFillList(FillListViewAssignment(docs)), null);
    }
}
4个回答

4
这是问题所在:
new DelegateFillList(FillListViewAssignment(docs)

您不能以这种方式创建委托。您需要提供一个“方法组”,它只是方法的名称:
 lvMyAssignments.Dispatcher.BeginInvoke
     (new DelegateFillList(FillListViewAssignment), new object[]{docs});

或者,您可以分成两个语句来完成:

DelegateFillList fillList = FillListViewAssignment;
lvMyAssignments.Dispatcher.BeginInvoke(fillList, new object[]{docs});

额外的“包装”数组的原因是您只有一个参数,即一个数组 - 您不希望它尝试将其解释为一堆不同的参数。

2

将最后一行改为:

 lvMyAssignments.Dispatcher.BeginInvoke(
      new DelegateFillList(FillListViewAssignment), docs);

我修改后出现了以下错误: 参数计数不匹配: FillListViewAssignment需要一个名为docs的参数,请问我该如何将其发送? - Tan
1
@ Tan: 请看我(修订后的)答案,可以解决那个问题。我不确定需要什么。 - Jon Skeet

1

我觉得你不必在else部分指定参数。

试试这个:

lvMyAssignments.Dispatcher.BeginInvoke(new DelegateFillList(FillListViewAssignment), new object[]{docs});

编辑 - 包括 new object[]{docs}。感谢Jon和Henk


1

这一行:

lvMyAssignments.Dispatcher.BeginInvoke(
    new DelegateFillList(FillListViewAssignment(docs)), null);

请注意,您将方法调用传递给委托,而不是方法名称。将其更改为以下内容:
lvMyAssignments.Dispatcher.BeginInvoke(
    new DelegateFillList(FillListViewAssignment),  null);
                                               ^
                                               |
                                               +- removed (docs)

但是我应该把参数文档放在哪里呢?FillListViewAssignment需要这个参数。 - Tan

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