【发布时间】:2022-10-15 00:59:29
【问题描述】:
我的问题可能很简单,但经过数十次尝试后我无法找到解决方案
所以我有一个函数,它递归地遍历我设置为参数的路径的文件、目录和子目录,在该函数内部,我有一个称为 cpt 的计数器,每次他找到一个文件时,他都会简单地将其增加 1。
在该函数中,我想每 30 秒监视一次添加到该计数器的文件数,因为有时目录很大,这些数字将被添加用于统计分析。
所以每 30 秒我想运行另一个函数,该函数将使用 WebClient 将该数字简单地发送到 PHP api。
我尝试了很多方法来解决这个问题,而不破坏计数器功能或不阻塞函数本身,但没有成功,我将添加代码,以便你们可以对这个问题提出新的想法
递归函数的代码:
int recursive(string path= "M:\\files\\data",int cpt = 0)
{
string[] files = Directory.GetFiles(path);
string[] dirs = Directory.GetDirectories(path);
foreach (var file in files)
{
try
{
cpt++;
}
catch { }
}
foreach (string directory in dirs)
{
try
{
cpt = hello(directory, cpt);
}
catch { }
}
return cpt;
}
应该每 30 秒运行一次的函数代码:
void postResult(int cpt)
{
var data = new System.Collections.Specialized.NameValueCollection
{
["result_nb"] = cpt.ToString(),
};
using (WebClient wc = new WebClient())
{
wc.UploadValues("http://127.0.0.1/work/analysis.php", data);
}
MessageBox.Show(cpt.ToString());
}
我在递归函数中尝试每 30 秒运行一次 postResult 函数的代码:
TimerCallback timerCallback = new TimerCallback(postResult(cpt));
System.Threading.Timer timer = new System.Threading.Timer(timerCallback, null, 1000, 15000);
这段代码给了我错误:“方法名称预期”||这里 => 新 TimerCallback(postResult(cpt))
所以显然使用计时器我无法传递计数器参数。
【问题讨论】:
-
您需要命名应该为 Timer 构造函数调用的方法。该方法由计时器而不是您调用。计时器不知道要赋予该方法什么值(它现在对您的 ctp 整数没有任何影响)。因此,编写一个从某处检索 ctp 值并将其用作 TimerCallback 的方法。一个简单的方法是
new System.Threading.Timer((_) => postResult(cpt), null, 1000, 15000);如果您的递归方法与您的问题有任何关系,请告诉我们如何。如果不将其从问题中删除。 -
@Ralf 在尝试您的代码并在 postResult 函数中简单地编写 MessageBox.Show 作为尝试时,我每秒得到 4 个带有随机数的 MessageBox,甚至没有增长的数字,这就是为什么我认为递归函数在那里是一个问题,你可以在您的环境中自己尝试代码,您将看到代码的行为
标签: c#