2012-01-24 3 views
5

у меня есть, что метод, который подсчитывает файлы в определенной папке:C#: Имя метода ожидается

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 

Я не понимаю; что от меня требуется эта ошибка?

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

ответ

10

Это

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"); 
+0

Спасибо, что сработали :) –

3

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

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

Даниэль избил меня. – Almo

1

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

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

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

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

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

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, так что бросок где-то или другой неизбежен.

Смежные вопросы