在给定的延迟后,简单的方法来执行方法?

Buj*_*uju 7 timer backgroundworker thread-safety windows-phone-7

是否有一种简单的方法可以在iOS开箱后的特定延迟后执行方法?

在iPhone上我会这样做:

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

然后,它将connectSensor在2.5秒后执行主线程(UI线程)上的方法.并且因为它是在主线程上自动调度的,所以您不必担心跨线程问题.(还有一个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);            
    } 
Run Code Online (Sandbox Code Playgroud)

如何将其封装到扩展方法中,以便我可以调用this.Perform(MyMethod, null, 2500);

ava*_*nek 11

您可以像这样使用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();
    }
Run Code Online (Sandbox Code Playgroud)

对此方法的调用如下所示:

this.Perform(() => MyMethod(), 2500);
Run Code Online (Sandbox Code Playgroud)

后台工作程序将在UI线程的一个线程上运行睡眠,这样您的应用程序可以在发生延迟时自由地执行其他操作.


Der*_*kin 8

您可以使用WP7的Reactive Extensions来观察计时器:

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

鉴于此代码的简洁性,我认为通过为其创建扩展方法不会获得太多收益:)有关WP7的Reactive Extensions的更多信息,请查看此MSDN页面 .