C#:应为方法名称

C#:应为方法名称,c#,multithreading,methods,C#,Multithreading,Methods,我有一种计算特定文件夹中文件数的方法: private void countfiles(string path) { if (path != "") { DirectoryInfo dir = new DirectoryInfo(path); foreach (FileInfo filesindires in dir.GetFiles()) {

我有一种计算特定文件夹中文件数的方法:

    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);
            }
        }           
    }
当用户点击count按钮时,我想创建一个线程,这样程序就不会挂起

Thread count = new Thread(new ThreadStart(countfiles(@"E:/test")));
但我甚至在调试之前就出现了这个错误:

Method Name Expected
我不明白;那个错误需要我做什么

最后,非常感谢您的帮助。

非常感谢

Thread count = new Thread(new ParameterizedThreadStart(countfiles));    
count.Start(@"E:/test");
您不必传递参数,只需传递方法名即可

您还需要将参数的类型更改为
对象
,而不是
字符串
。或者,如果要保留
字符串
参数,可以使用:

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

查看
ParameterizedThreadStart
委托。这将为您传递值

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

ThreadStart构造函数预期您的代码如下所示:

Thread count = new Thread(new ThreadStart(countfiles));
count.Start();
它需要知道执行哪个方法,而不是方法的结果。但由于您有一个参数,因此需要这样做:

Thread count = new Thread(new ParameterizedThreadStart(countFiles));
count.Start(@"E:/test");
问题在于:

new ThreadStart(countfiles(@"E:/test"))
参数是试图伪装为方法组的方法调用。编译器可以将兼容的方法组、lambda表达式或匿名方法转换为委托类型,但不能转换为方法调用

请尝试以下方法之一:

// 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) 
您也可以使用
参数化的threadstart
委托类型和
线程
构造函数的相关重载,但由于参数是
对象
,因此在某个地方或另一个地方进行强制转换是不可避免的