Простой способ оправдать метод после заданной задержки? - PullRequest
7 голосов
/ 18 января 2011

Есть ли простой способ выполнить метод после заданной задержки, как в iOS из коробки?

На iPhone я бы сделал это:

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

Затем будет запланировано выполнение метода connectSensor в главном потоке (потоке пользовательского интерфейса) через 2,5 секунды. И поскольку это автоматически запланировано в главном потоке, вам не нужно беспокоиться о проблемах между потоками. (Существует также версия performSelectorOnBackground)

Так как бы я сделал это правильно в WP7?

В настоящее время я выполняю это с помощью таймера, но я не уверен, что это хорошее решение.

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

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

Как это может быть заключено в метод расширения, чтобы я мог просто вызвать this.Perform(MyMethod, null, 2500);?

Ответы [ 2 ]

11 голосов
/ 19 января 2011

Вы можете использовать BackgroundWorker следующим образом:

    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();
    }

Вызов этого метода будет выглядеть следующим образом:

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

Фоновый рабочий будет запускать режим сна в потоке вне потока пользовательского интерфейса, чтобы ваше приложение могло свободно выполнять другие действия, пока происходит задержка.

8 голосов
/ 18 января 2011

Вы можете использовать Reactive Extensions для WP7 для наблюдения по таймеру:

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

Учитывая краткость этого кода, я не думаю, что вы многого выиграете, создав для него метод расширения :) Для получения дополнительной информации о Reactive Extensions для WP7 посмотрите на эту страницу MSDN .

...