Вызов универсального EventHandler, TargetParameterCountException - PullRequest
2 голосов
/ 20 марта 2010

У меня есть класс DirectoryMonitor, который работает в другом потоке. Объявлены следующие события:

public class DirectoryMonitor
{
    public event EventHandler<MonitorEventArgs> CreatedNewBook;
    public event EventHandler ScanStarted;
    ....
}

public class MonitorEventArgs : EventArgs
{
    public Book Book { get; set; }
}

Существует форма, использующая этот монитор, и после получения событий она должна обновить отображение.

Теперь это работает:

    void DirectoryMonitor_ScanStarted(object sender, EventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new EventHandler(this.DirectoryMonitor_ScanStarted));
        }
        else {...}
    }

Но это бросает TargetParameterCountException:

    void DirectoryMonitor_CreatedNewBook(object sender, MonitorEventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new EventHandler<MonitorEventArgs>(this.DirectoryMonitor_CreatedNewBook));
        }
        else {...}
    }

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 20 марта 2010

Метод Invoke исключает получение экземпляра System.Delegate, который можно вызвать без передачи каких-либо дополнительных параметров. Для делегата, созданного с помощью DirectoryMonitor_ScanStarted, требуется 2 параметра, и, следовательно, вы получите исключение при его использовании.

Вам необходимо создать новый делегат, который объединит вызов и аргументы вместе.

MethodInvoker del = () => this.DirectoryMonitor_ScanStarted(sender,e);
Invoke(del);
0 голосов
/ 08 января 2013

Вам не хватает параметров: -

void DirectoryMonitor_ScanStarted(object sender, MonitorEventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new EventHandler<MonitorEventArgs>(DirectoryMonitor_ScanStarted), sender, e);
        }
        else {...}
    }

По неясным для меня причинам (возможно, из-за устаревшего COM) допустимо пропускать параметры при использовании общего события, но не при использовании пользователяопределенный тип EventArg.

...