如何在计时器外部更改临时变量值?

时间:2019-04-16 08:42:06

标签: c#

作为一个问题,我需要继续检查文件夹是否在3分钟内创建完毕...最初,我将myVar设置为0,每次计时器运行时,它将在else部分中一直添加到3,然后执行其他操作功能。任何人都可以在这件事上为我提供帮助,因为我不熟悉将数据解析为计时器...

class Program
{
    public static void Main(string[] args)
    {
        int myVar = 0;
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Interval = 60000; // Currently set to 1 minutes
        timer.Elapsed += (sender, e) => timer_Elapsed(sender, e, myVar);
        timer.Start();
    }

    static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e, int myVar)
    {
        DirectoryInfo imagepath = new DirectoryInfo(@"C:\Users");

        DirectoryInfo[] directoryInfo = imagepath.GetDirectories();

        string directoryFolderName = "";
        string subdirectoryFolderName = "";
        string fullPathName = "";


        foreach (DirectoryInfo directory in directoryInfo)
        {
            directoryFolderName = directory.Name;
        }

        if (directoryFolderName.Contains("ABB"))
        {

            fullPathName = imagepath + "\\" + directoryFolderName;
            DirectoryInfo path = new DirectoryInfo(fullPathName);
            DirectoryInfo[] subdirectoryInfo = path.GetDirectories(); ;

            foreach (DirectoryInfo subDirectory in subdirectoryInfo)
              subdirectoryFolderName = subDirectory.Name;


            if (subdirectoryFolderName.Contains("folder"))
            {
                string tempPath = fullPathName + "\\" + "folder";
                mainFunction(path, imagepath);
            }
            else
            {
                Console.WriteLine(fullPathName);
                Console.WriteLine("tif folder not found!!!");
                string msg = "Program failed unexpectedly. Error Msg: folder not found!!!";
                WriteExceptionFile(msg, null);
            }

        }
        else
        {
            Console.WriteLine("Minutes: " + myVar);
            myVar += 1;
        }
}

3 个答案:

答案 0 :(得分:2)

默认情况下,int是按值传递的,这意味着当您在timer_elapsed方法内部更新变量时,该变量不会反映在该方法之外。

一个简单的解决方案是强制使用ref关键字通过引用传递int:

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e, ref int myVar){ ... }

这是一个简单的演示:https://rextester.com/UOBCK74072

答案 1 :(得分:0)

您将myVar作为参数发送。因此,方法的更改不能更改主变量的值。 您可以定义myVar静态变量并直接更改其值。也可以使用main方法之外的全局变量。

    static int x = 0;
    static void Main(string[] args)
    {
        Console.WriteLine(x); // before call foo->0
        foo();
        Console.WriteLine(x); // after call foo -> 10
        Console.ReadKey();
    }


    public static void foo()
    {
        x = 10;
    }

答案 2 :(得分:-1)

使用out关键字从计时器回调中获取更新的值

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e, out int myVar) { ... }

这应该有效。