2012-01-24 17 views
5

tengo ese método que cuenta los archivos en una carpeta determinada:C#: Nombre del método espera

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); 
      } 
     }   
    } 

y cuando el usuario hace clic en el botón de recuento que quería hacer un hilo, por lo que el programa no se cuelga .

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

Pero me sale este error, incluso antes de la depuración:

Method Name Expected 

no entiendo; ¿Qué necesita ese error de mí?

Finalmente muchas gracias por su ayuda con anticipación.

Respuesta

10

Es

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

Usted no tiene que pasar los parámetros, sólo el nombre del método.

También deberá cambiar el tipo del parámetro a object, no a string. Alternativamente, si desea mantener el parámetro string, puede utilizar:

Thread count = new Thread(
    o => 
    { 
     countFiles((string)o);  
    }); 
count.Start(@"E:/test"); 
+0

Gracias funcionó :) –

3

Tenga una mirada en el delegado ParameterizedThreadStart. Esto pasará los valores por ti.

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

Daniel me ganó. – Almo

1

El constructor ThreadStart Se espera que el código para parecerse a:

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

Se necesita saber el método a ejecutar, no el resultado del método. Pero ya que usted tiene un parámetro, es necesario hacerlo de esta manera:

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

El problema está aquí:

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

el argumento es una método de guardia tratando de hacerse pasar por un método -grupo. El compilador puede convertir un método de grupo, lambda o método anónimo compatible en un tipo delegado pero no en una llamada a método.

probar uno de estos:

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

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

Si desea utilizar un método de grupo, se necesita un método separado:

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

y entonces usted puede hacer:

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

También podría trabajar con el tipo delegado ParameterizedThreadStart y las sobrecargas asociadas del Thread constructor, pero es un poco incómodo trabajar con él ya que el argumento es object, por lo que un lanzamiento en alguna parte u otra será inevitable.

Cuestiones relacionadas