【问题标题】:Dotnet - Threading Timer Not Running [duplicate]Dotnet - 线程计时器未运行[重复]
【发布时间】:2020-01-02 04:23:18
【问题描述】:

我一直在阅读有关 c# Threading Timer 的信息,并希望在我的控制台应用程序中使用它。我创建了一个独立项目,因此我可以对其进行测试,但我无法让一个简单的计时器运行。当我运行下面的代码时,我从控制台得到的只是 hello world 消息,但我没有看到任何计时器输出。我将其更改为将输出写入文件,以查看它是否只是在后台运行。然而,这也没有任何结果。如果与它有任何关系,我将使用 dotnet (2.1) 作为运行时。

有人看到下面的代码没有启动计时器的原因吗?

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static Timer _timer = null;
        static void Main(string[] args)
        {
            _timer = new Timer(x =>
            {
                Console.WriteLine("Timer is running");

            }, null, 1000, Timeout.Infinite);

            Console.WriteLine("Hello World!");
        }
    }
}

【问题讨论】:

  • 程序在计时器开始运行之前退出。尝试将Console.ReadLine() 添加到Main 的末尾。
  • 您的计时器使用后台线程,后台线程不会阻止进程退出。只有前台线程会这样做,并且您唯一的前台线程会在使用 WriteLine() 调用完成后立即退出。查看标记的重复项以了解各种技术,以使控制台程序运行足够长的时间以看到它做某事。

标签: c# multithreading .net-core timer


【解决方案1】:

这将等待计时器完成一次,但是如果您希望“无限”长时间运行计时器(直到按下回车键)我建议使用 Console.ReadLine() 正如@Johnny Mopp 上面写的那样

假设您仍想使用 Timeout.Infinite - 创建一个布尔值,我们将在计时器完成后更新它。

bool TaskFinished = false;

然后运行一个while循环,等待计时器完成。

while(!TaskFinished);

例子:

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static Timer _timer = null;
        static void Main(string[] args)
        {
            bool TaskFinished = false;
            _timer = new Timer(x =>
            {
                Console.WriteLine("Timer is running");
                TaskFinished = true;

            }, null, 1000, Timeout.Infinite);

            Console.WriteLine("Hello World!");
            while(!TaskFinished);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多