6
votes

I am building a Xamarin cross platform app targeting IOS Android and Windows Phone 8.1 using .Net 4.5.1. When I try to reference System.Timers in the PCL project, it is not there. How do I fix this?

2
This 'behavior' matches and follows what is actually available in 4.5.1 portable. I believe it is now in 4.5.2, but that does not help you now on Xamarin/iOS-Andriod. See for details: stackoverflow.com/questions/12555049/timer-in-portable-library - SushiHangover
Also discussed and replied to by Xamarin on their forums: forums.xamarin.com/discussion/17227/… - SushiHangover

2 Answers

11
votes

You can use : Device.StartTimer

Syntax :

public static void StartTimer (TimeSpan interval, Func<bool> callback)

Examples : increment number every 1 seconds for 1 minutes

int number = 0;
Device.StartTimer(TimeSpan.FromSeconds(1),() => {
    number++;
    if(number <= 60) 
    {
        return true; //continue
    }
    return false ; //not continue

});

Examples : wait for 5 seconds to run function one time

Device.StartTimer(TimeSpan.FromSeconds(5),() => {
    DoSomething();
    return false ; //not continue
});
5
votes

I noticed this the other day. Eventhough the class is in the API documentation System.Threading.Timer Class..Annoying.

Anyway I created my own Timer class, using Task.Delay():

public class Timer
{

        private int _waitTime;
        public int WaitTime
        {
            get { return _waitTime; }
            set { _waitTime = value; }
        }

        private bool _isRunning;
        public bool IsRunning
        {
            get { return _isRunning; }
            set { _isRunning = value; }
        }

        public event EventHandler Elapsed;
        protected virtual void OnTimerElapsed()
        {
            if (Elapsed != null)
            {
                Elapsed(this, new EventArgs());
            }
        }

        public Timer(int waitTime)
        {
            WaitTime = waitTime;
        }

        public async Task Start()
        {
            int seconds = 0;
            IsRunning = true;
            while (IsRunning)
            {
                if (seconds != 0 && seconds % WaitTime == 0)
                {
                    OnTimerElapsed();
                }
                await Task.Delay(1000);
                seconds++;
            }
        }

        public void Stop()
        {
            IsRunning = false;
        }
}