methuselah
methuselah

Reputation: 13206

Replace code with timer as opposed to thread sleep

According to this Stack Overflow discussion,using Thread.Sleep() is almost always a bad idea. How would I refactor my code to use a timer instead. I tried to make a start by doing the following:

namespace Engine
{
    internal class Program
    {
        public static DbConnect DbObject = new DbConnect();

        System.Timers.Timer timer = new System.Timers.Timer();

        // error here
        timer.Interval = 2000;
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled=false;
    }
}

but kept getting a cannot resolve symbol error message.

namespace Engine
{
    internal class Program
    {
    public static DbConnect DbObject = new DbConnect();
    private static void Main()
    {
        SettingsComponent.LoadSettings();

        while (true)
        {
            try
            {
                for (int x = 0; x < 4; x++)
                {
                    GenerateRandomBooking(); 
                }
                Thread.Sleep(2000); 
                GenerateRandomBids();
                AllocateBids();
                Thread.Sleep(2000); 
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
    }
}

Upvotes: 1

Views: 644

Answers (2)

Matthew Watson
Matthew Watson

Reputation: 109597

If you are using .Net 4.5 or later, you can use await instead of a Timer.

For example:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Demo
{
    public static class Program
    {
        private static void Main()
        {
            Console.WriteLine("Generating bids for 30 seconds...");

            using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
            {
                var task = GenerateBids(cancellationTokenSource.Token);

                // You can do other work here as required.

                task.Wait();
            }

            Console.WriteLine("\nTask finished.");
        }

        private static async Task GenerateBids(CancellationToken cancel)
        {
            while (!cancel.IsCancellationRequested)
            {
                Console.WriteLine("");

                try
                {
                    for (int x = 0; x < 4; x++)
                        GenerateRandomBooking();

                    await Task.Delay(2000);

                    if (cancel.IsCancellationRequested)
                        return;

                    GenerateRandomBids();
                    AllocateBids();

                    await Task.Delay(2000);
                }

                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
        }

        private static void AllocateBids()
        {
            Console.WriteLine("AllocateBids()");
        }

        private static void GenerateRandomBids()
        {
            Console.WriteLine("GenerateRandomBids()");
        }

        private static void GenerateRandomBooking()
        {
            Console.WriteLine("GenerateRandomBooking()");
        }
    }
}

Upvotes: 2

Rohit Prakash
Rohit Prakash

Reputation: 1972

you can convert your code this one without using Thread.Sleep()

private static void Main()
    {
        SettingsComponent.LoadSettings();

        //while (true)
        {
            try
            {
                RaiseRandomBooking(null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }

    static void RaiseRandomBooking(object state)
    {
        for (int x = 0; x < 4; x++)
        {
            GenerateRandomBooking();
        }
        System.Threading.Timer tmr = new System.Threading.Timer(RaiseRandomBids, null, 0, 2000);
    }

    static void RaiseRandomBids(object state)
    {
        GenerateRandomBids();
        AllocateBids();
        System.Threading.Timer tmr = new System.Threading.Timer(RaiseRandomBooking, null, 0, 2000);
    }

Upvotes: 1

Related Questions