【问题标题】:C# Issue while trying to use System.Threading.Timer尝试使用 System.Threading.Timer 时出现 C# 问题
【发布时间】: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#


【解决方案1】:

您可以尝试将您的 cpt 声明为静态,以便递归和 postResult 都可以访问它

【讨论】:

    【解决方案2】:

    所以

    int cpt = 0; System.Threading.Timer tmr; 
    void Init()
    {
        tmr = new (postResult, null, 30000, 30000);
        recursive();
    }
    void recursive(string path = "M:\files\data")
    {
        cpt += Directory.GetFiles(path).Length;
        foreach (string directory in Directory.GetDirectories(path))
        {
            try
            {
                recursive(directory);
            }
            catch { }
        }
    }
    void postResult(object? o)
    {
        //... 
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多