在开箱即用的iOS中,有一种简单的方法可以在给定的延迟后执行方法吗?
在iPhone上我会这样做:
[self performSelector:@selector(connectSensor) withObject:nil afterDelay:2.5];
然后,它将在2.5秒后执行主线程(UI线程)上的方法connectSensor
。并且因为它是在主线程上自动调度的,所以您不必担心跨线程问题。 (还有一个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);
?
答案 0 :(得分: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();
}
对此方法的调用如下所示:
this.Perform(() => MyMethod(), 2500);
后台工作程序将在UI线程的一个线程上运行睡眠,这样你的应用程序可以在发生延迟时自由地做其他事情。
答案 1 :(得分:8)
您可以使用WP7的Reactive Extensions来观察计时器:
Observable
.Timer(TimeSpan.FromMilliseconds(2500))
.SubscribeOnDispatcher()
.Subscribe(_ =>
{
NavigationService.GoBack();
});
鉴于此代码简洁,我认为通过为其创建扩展方法不会获得太多收益:)有关WP7的Reactive Extensions的更多信息,请查看此MSDN page