跨线程调用异常

时间:2017-06-17 12:49:22

标签: c# winforms

为了通过另一个线程更改控件,我需要调用一个委托来更改控件但是,它正在抛出一个TargetParameterCountException

private void MethodParamIsObjectArray(object[] o) {}
private void MethodParamIsIntArray(int[] o) {}

private void button1_Click(object sender, EventArgs e)
{
        // This will throw a System.Reflection.TargetParameterCountException exception
        Invoke(new Action<object[]>(MethodParamIsObjectArray), new object[] { });
        // It works
        Invoke(new Action<int[]>(MethodParamIsIntArray), new int[] { });
}

为什么用MethodParamIsObjectArray调用会引发异常?

2 个答案:

答案 0 :(得分:4)

这是因为Invoke方法的签名为:

object Invoke(Delegate method, params object[] args)

params参数前面的args关键字表示此方法可以将可变数量的对象作为参数。提供对象数组时,它在功能上等同于传递多个以逗号分隔的对象。以下两行在功能上是等效的:

Invoke(new Action<object[]>(MethodParamIsObjectArray), new object[] { 3, "test" });
Invoke(new Action<object[]>(MethodParamIsObjectArray), 3, "test");

将对象数组传递到Invoke的正确方法是将数组转换为Object类型:

Invoke(new Action<object[]>(MethodParamIsObjectArray), (object)new object[] { 3, "test" });

答案 1 :(得分:0)

Invoke需要一个包含参数值的对象数组。

在第一次通话中,您不提供任何值。您需要一个值,这可能令人困惑地需要成为一个对象数组本身。

new object[] { new object[] { }  }

在第二种情况下,您需要一个包含整数数组的对象数组。

new object[] { new int[] { }  }