C #: ожидается имя метода - PullRequest
5 голосов
/ 25 января 2012

У меня есть метод подсчета файлов в определенной папке:

    private void countfiles(string path)
    {
        if (path != "")
        {
            DirectoryInfo dir = new DirectoryInfo(path);

            foreach (FileInfo filesindires in dir.GetFiles())
            {
                if (filesindires.FullName != Application.ExecutablePath)
                {
                    num_files++;
                    Thread.Sleep(1);
                }
            }

            foreach (DirectoryInfo dirsinfolder in dir.GetDirectories())
            {
                countfiles(dirsinfolder.FullName);
            }
        }           
    }

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

Thread count = new Thread(new ThreadStart(countfiles(@"E:/test")));

Но я получаю эту ошибку еще до отладки:

Method Name Expected

Я не понимаю;зачем мне эта ошибка?

Наконец, большое спасибо за вашу помощь заранее.

Ответы [ 4 ]

11 голосов
/ 25 января 2012

Это

Thread count = new Thread(new ParameterizedThreadStart(countfiles));    
count.Start(@"E:/test");

Вам не нужно передавать параметры, только имя метода.

Также вам нужно будет изменить тип параметра на object, а не string. В качестве альтернативы, если вы хотите сохранить параметр string, вы можете использовать:

Thread count = new Thread(
   o => 
   {
       countFiles((string)o);    
   });
count.Start(@"E:/test");
6 голосов
/ 25 января 2012

Проблема здесь:

new ThreadStart(countfiles(@"E:/test"))

Аргументом является вызов метода , пытающийся маскироваться под группу методов . Компилятор может преобразовать совместимую группу методов, лямбда-выражение или анонимный метод в тип делегата, но не в вызов метода.

Попробуйте один из них:

// Lambda
var thread = new Thread(() => countfiles(@"E:/test")); 

// Anonymous method
var thread = new Thread( delegate() { countfiles(@"E:/test"); }); 

Если вы хотите использовать метод-группу, вам понадобится отдельный метод:

private void CountTestFiles()
{
     countFiles(@"E:/test");
}

и тогда вы можете сделать:

// Method-group
var thread = new Thread(CountTestFiles) 

Вы также можете работать с типом делегата ParameterizedThreadStart и связанными с ним перегрузками конструктора Thread, но работать с ним немного неудобно, поскольку аргумент равен object, поэтому приведение куда-либо или другое приведет к быть неизбежным.

3 голосов
/ 25 января 2012

Посмотрите на делегата ParameterizedThreadStart.Это передаст значения для вас.

Thread count = new Thread(countfiles); 
count.Start(@"E:/test");
1 голос
/ 25 января 2012

Ожидается, что конструктор ThreadStart будет выглядеть следующим образом:

Thread count = new Thread(new ThreadStart(countfiles));
count.Start();

Необходимо знать, какой метод выполнить, а не его результат.Но так как у вас есть параметр, вам нужно сделать это так:

Thread count = new Thread(new ParameterizedThreadStart(countFiles));
count.Start(@"E:/test");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...