Несоответствие количества параметров при вызове управления с несколькими параметрами - PullRequest
2 голосов
/ 19 января 2012

Я использую поток, чтобы выполнить какой-то процесс на машине.В конце концов, прогресс сообщается в другом потоке.Чтобы обновить GUI со статусом процесса, я использую делегат, подобный этому:

public delegate void UpdateProgressDelegate(string description, int scriptnumber);
public void UpdateProgress(string description, int scriptnumber) {
    if (treeView.InvokeRequired) {
        treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), description, scriptnumber);
        return;
    }
    // Update the treeview
}

И для вызова этого делегата я использую:

form.UpdateProgress("Ready", 3);

Когда вызывается Invoke,Я получаю TargetParameterCountException: Несоответствие количества параметров.Я думал, что смогу это исправить, поместив параметры string и int в один объект, например, так:

public delegate void UpdateProgressDelegate(object[] updateinfo);
public void UpdateProgress(object[] updateinfo) {
    string description = (string) updateinfo[0];
    int scriptnumber = (int) updateinfo[1];
    if (treeView.InvokeRequired) {
        treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), new object[] { description, scriptnumber });
        return;
    }       
    // Update the treeview
}

И для его вызова я использую:

form.UpdateProgress(new object[] {"Ready", 3});

Но это не такработать тоже.Я продолжаю получать одно и то же исключение TargetParameterCountException.Есть идеи, как я мог это исправить?Заранее спасибо!

Ответы [ 2 ]

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

Я бы сказал: сделать это простым способом:

treeView.Invoke((MethodInvoker)delegate {
    UpdateProgress(description, scriptnumber);
});

или (в равной степени):

treeView.Invoke((MethodInvoker) () => UpdateProgress(description, scriptnumber));

Это дает вам статическую проверку в компиляторе, а IIRC MethodInvoker проверяется явно и вызывается с Invoke() вместо DynamicInvoke(), что также делает его более быстрым.


Почему это не работает;в вашем примере с:

public delegate void UpdateProgressDelegate(object[] updateinfo);

вы фактически передаете два параметра;для устранения неоднозначности и передачи одного массива в params здесь необходимо дважды обернуть его:

treeView.Invoke(new UpdateProgressDelegate(UpdateProgress),
    new object[] { new object[] {description, scriptnumber }});

По сути, внешний массив - это «массив всех параметров», который содержит одинэлемент, который является массивом, который мы не хотим передавать в качестве первого параметра (updateinfo).

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

Это должно работать:

public delegate void UpdateProgressDelegate(string description, int scriptnumber);
public void UpdateProgress(string description, int scriptnumber) {
    if (treeView.InvokeRequired) {
        treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), new object[] { description, scriptnumber });
        return;
    }
    // Update the treeview
}
...