单线程的多线程和计时器

时间:2019-02-14 14:34:06

标签: c# timer

我像这样用单例实现一个类

        public static SingleToneClass Instance
        {
            get
            {
                return Lazy.Value;
            }
        }
private static readonly Lazy<SingleToneClass > Lazy = new Lazy<SingleToneClass >(() => new RABTProxy());

SingleToneClass中有一个System.Timers计时器

在尝试从不同线程访问类时,计时器突然停止 任何想法如何解决这样的问题,这只是测试的示例

 class Program
{
    static void Main(string[] args)
    {

        //now create a timer each ten seconds create for create 
        var mainTimer = new Timer
        {
            Interval = 100
        };
        mainTimer.Elapsed += (sender, eventArgs) =>
        {

            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    SingleToneClass.Instance.DoWwork();

                    Thread.Sleep(10);
                }

            });
        };

        mainTimer.Start();
        Console.ReadLine();
    }
}

在Singleton中使用计时器是个好主意

2 个答案:

答案 0 :(得分:0)

您的评论说每10秒就有一个计时器,但实际上您每秒获得10次。

然后,您将在线程池上产生新任务,这些任务将永远运行并被Thread.Sleep()阻塞。这将使用您的所有线程池线程,并且必须创建新的线程池线程。不好!<​​/ p>

如果只想定期调用DoWork,则应跳过计时器并启动一个任务。

        Task.Factory.StartNew(async () =>
        {
            while (true)
            {
                SingleToneClass.Instance.DoWwork();
                await Task.Delay(TimeSpan.FromSeconds(10));
            }

        });

答案 1 :(得分:0)

使用Microsoft的Reactive Framework(又名Rx)-仅获取NuGet System.Reactive并添加using System.Reactive.Linq;

然后执行以下操作:

Observable
    .Interval(TimeSpan.FromMilliseconds(10.0))
    .Subscribe(_ =>  SingleToneClass.Instance.DoWwork());