使用BeginInvoke时参数计数不匹配异常

时间:2012-01-30 15:05:55

标签: c++ .net c++-cli

我在C ++ .NET表单应用程序中有一个后台工作程序,它运行异步。在这个后台工作者的DoWork函数中,我想在datagridview中添加行,但是我无法弄清楚如何使用BeginInvoke执行此操作,因为我的代码似乎不起作用。

我的代码

delegate void invokeDelegate(array<String^>^row);

....
In the DoWork of the backgroundworker
....

array<String^>^row = gcnew array<String^>{"Test", "Test", "Test"};
if(ovlgrid->InvokeRequired)
    ovlgrid->BeginInvoke(gcnew invokeDelegate( this, &Form1::AddRow), row);

....

void AddRow(array<String^>^row)
{
 ovlgrid->Rows->Add( row );
}

我得到的错误是:

  

未处理的类型异常   发生'System.Reflection.TargetParameterCountException'   mscorlib.dll中

     

附加信息:参数计数不匹配。

当我更改代码以不传递任何参数时它才起作用,代码变为:

delegate void invokeDelegate();

...
In the DoWork function
...

if(ovlgrid->InvokeRequired)
     ovlgrid->BeginInvoke(gcnew invokeDelegate( this, &Form1::AddRow));

...
void AddRow()
{
     array<String^>^row = gcnew array<String^>{"test","test2","test3"};
     ovlgrid->Rows->Add( row );
}

但问题是我想传递参数。 我想知道我做错了什么导致了parametercountexception以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

你遇到的问题是BeginInvoke takes an array of parameters并且你传递了一个恰好是一个参数的数组。

  

<强>参数

     

方法

     

输入:System.Delegate

     

获取args中指定的参数的方法的委托,该方法被推送到Dispatcher事件队列。

     

ARGS

     

输入:System.Object[]

     

要作为参数传递给给定方法的对象数组。可以是null

因此,BeginInvoke认为您的方法有{strong> 3 字符串参数:"test""test2""test3"。您需要传递一个仅包含row

的数组
array<Object^>^ parms = gcnew array<Object^> { row };
ovlgrid.BeginInvoke(gcnew invokeDelegate(this, &Form1::AddRow), parms);