我有计算某个文件夹中文件的方法:
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
我不明白;这个错误需要我什么?
最后非常感谢您的帮助。
答案 0 :(得分:11)
这是
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");
答案 1 :(得分:6)
问题在于:
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)
您也可以使用ParameterizedThreadStart
委托类型和Thread
构造函数的关联重载,但由于参数为object
,因此使用起来有点尴尬,所以a在某个地方或另一个地方施放是不可避免的。
答案 2 :(得分:3)
查看ParameterizedThreadStart
代表。这将为您传递值。
Thread count = new Thread(countfiles);
count.Start(@"E:/test");
答案 3 :(得分:1)
ThreadStart构造函数应该是您的代码:
Thread count = new Thread(new ThreadStart(countfiles));
count.Start();
需要知道要执行的方法,而不是方法的结果。但是因为你有一个参数,你需要这样做:
Thread count = new Thread(new ParameterizedThreadStart(countFiles));
count.Start(@"E:/test");