Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 7 在给定延迟后执行方法的简单方法?_Windows Phone 7_Timer_Thread Safety_Backgroundworker - Fatal编程技术网

Windows phone 7 在给定延迟后执行方法的简单方法?

Windows phone 7 在给定延迟后执行方法的简单方法?,windows-phone-7,timer,thread-safety,backgroundworker,Windows Phone 7,Timer,Thread Safety,Backgroundworker,有没有一种简单的方法可以在给定的延迟后执行一个方法,比如在iOS开箱即用的情况下 在iPhone上,我会这样做: [自执行选择器:@选择器(连接传感器),对象:无延时:2.5] 然后,它将在主线程(UI线程)上安排方法connectSensor在2,5秒后执行。而且因为它是在主线程上自动调度的,所以您不必担心跨线程问题。(还有一个performSelectorOnBackground版本) 那么在WP7中如何正确执行此操作? 目前我正在用定时器完成这项工作,但我不确定这是否是一个好的解决方案

有没有一种简单的方法可以在给定的延迟后执行一个方法,比如在iOS开箱即用的情况下

在iPhone上,我会这样做:

[自执行选择器:@选择器(连接传感器),对象:无延时:2.5]

然后,它将在主线程(UI线程)上安排方法
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)

您可以使用WP7的反应式扩展在计时器上观察:

可观察
.计时器(时间跨度从毫秒(2500))
.SubscribeOnDispatcher()
.Subscribe(=>
{
NavigationService.GoBack();
});

考虑到这段代码的简洁性,我认为为它创建一个扩展方法不会有多大好处:)有关WP7的反应式扩展的更多信息,请看以下内容
.

您可以使用这样的后台工作人员:

    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线程之外的线程上运行睡眠,这样,当延迟发生时,您的应用程序可以自由地执行其他操作。

但是,我必须再次取消订阅,这并不是我真正想要的。我想要一个优雅(或多或少)的单行程序在延迟后执行一个方法。根据文档,SubscribeOnDispatcher使用当前的dispatcher订阅和取消订阅观察员。thx没有读取取消订阅部分。刚刚尝试过,但SubscribeOnDispatcher不接受任何参数。因此,您发布的代码无法编译。它是否缺少一个
SubscribeOnDispatcher().Do((o)=>…)?即使如此,如果我这样做,do()中的代码也不会被执行。对于这个错误,我深表歉意。令人困惑的是,应该有一个额外的订阅;我已经更新了原始答案中的代码。我认为用
.observeOnDispatcher()或
.observeOnDispatcher()替换
.SubscribeOnDispatcher()
应该可以。为什么这比使用计时器更好?
this.Perform(() => MyMethod(), 2500);