Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Easy way to excecute method after a given delay?

Is there a easy way to perform a method after a given delay like in iOS out of the box?

On iPhone I would do this:

[self performSelector:@selector(connectSensor) withObject:nil afterDelay:2.5];

It will then schedule the method connectSensor on the main thread (UI thread) to be executed after 2,5 seconds. And because it is automatically scheduled on the main thread, you don't have to worry about cross thread issues. (There is also a performSelectorOnBackground version)

So how would I do this properly in WP7?

Currently I'm accomplishing this with a timer, but I'm not sure if this is a good solution.

    private Timer timer;
    private void DoSomethingAfterDaly()
    {
        // ... do something here

        timer = new Timer( (o) => Deployment.Current.Dispatcher.BeginInvoke(() => NavigationService.GoBack()), null, 2500, Timeout.Infinite);            
    } 

How could this be encapsulated into an extension method so I can just call this.Perform(MyMethod, null, 2500); ?

like image 531
Buju Avatar asked Jan 18 '11 16:01

Buju


2 Answers

You can use a BackgroundWorker like so:

    private void Perform(Action myMethod, int delayInMilliseconds)
    {
        BackgroundWorker worker = new BackgroundWorker();

        worker.DoWork += (s, e) => Thread.Sleep(delayInMilliseconds);

        worker.RunWorkerCompleted += (s, e) => myMethod.Invoke();

        worker.RunWorkerAsync();
    }

The call into this method would look like this:

this.Perform(() => MyMethod(), 2500);

The background worker will run the sleep on a thread off of the UI thread so your application is free to do other things while the delay is occurring.

like image 159
avanek Avatar answered Oct 24 '22 18:10

avanek


You can use the Reactive Extensions for WP7 to observe on a timer:

Observable
  .Timer(TimeSpan.FromMilliseconds(2500))
  .SubscribeOnDispatcher()
  .Subscribe(_ =>
    {
      NavigationService.GoBack();
    });

Given the brevity of this code, I don't think you'd gain much by creating an extension method for it :) For more information about the Reactive Extensions for WP7, take a look at this MSDN page .

like image 37
Derek Lakin Avatar answered Oct 24 '22 19:10

Derek Lakin