Исключение несоответствия счетчика параметров при использовании BeginInvoke - PullRequest
4 голосов
/ 30 января 2012

У меня есть фоновый работник в приложении C ++ .NET Forms, которое работает асинхронно. В функции DoWork этого фонового работника я хочу добавить строки в представление данных, однако я не могу понять, как это сделать с помощью 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 );
}

Проблема в том, что я хочу передать параметры. Мне было интересно, что я делаю неправильно, что вызывает исключение параметра и как это исправить?

1 Ответ

2 голосов
/ 30 января 2012

Проблема, с которой вы столкнулись: BeginInvoke принимает массив параметров , и вы передаете ему массив, который оказывается единственным параметром.

Параметры

метод

Тип: System.Delegate

Делегат метода, который принимает параметры, указанныев args, который помещается в очередь событий Dispatcher.

args

Тип: System.Object[]

Массив объектов для передачив качестве аргументов для данного метода.Может быть null.

Следовательно, BeginInvoke принимает это как значение, что у вас есть 3 строковых параметров для метода: "test", "test2" и "test3".Вам нужно передать массив, содержащий только ваши row:

array<Object^>^ parms = gcnew array<Object^> { row };
ovlgrid.BeginInvoke(gcnew invokeDelegate(this, &Form1::AddRow), parms);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...