设备上发布模式下的间歇性NSTimer问题

时间:2011-03-29 13:35:14

标签: iphone deployment xamarin.ios nstimer

我遇到问题,在我的设备上大部分时间,但不是全部时间,在发布模式下编译时,我的NSTimer操作未被调用。它在设备的调试模式下总是很好,并且在模拟器中的任何一种模式下总是很好。

对于这种情况,唯一有点不同寻常的是,它包含在另一个类中,允许我们在运行时注入特定于平台的实现,比如计时器,向前调整到monodroid等。但是没有什么特别不寻常的事情发生。

代码:

using System;
using MonoTouch.Foundation;
namespace OurCompany.PlatformAbstraction.Ios
{
  public class IosTimer : IPlatformTimer
  {
    private NSTimer backingTimer;
    public double IntervalMs{get; set;}

    public IosTimer(double intervalMS)
    {
        this.IntervalMs = intervalMS;
    }

    public event EventHandler Elapsed;

    private void NsTimerElapsed()
    {
        if (Elapsed != null)
        {
            Elapsed(this, EventArgs.Empty);
        }
    }

    public void Start ()
    {
        TimeSpan ts = TimeSpan.FromMilliseconds(this.IntervalMs);
        this.backingTimer = NSTimer.CreateRepeatingScheduledTimer(ts, NsTimerElapsed);
    }

    public void Stop ()
    { 
        this.backingTimer.Invalidate();
        this.backingTimer = null;
    }
  }
}

致电代码:

private IosTimer t;

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    t = new IosTimer(100);
    t.Elapsed += UpdateLabel;
    t.Start();
}

private void UpdateLabel(object sender, EventArgs e)
{
    // not being called in Release mode on the phone
    // works fine in Debug mode on the phone, works fine in both modes in the simulator
}

我也注意到一般的行为差异 - 在模拟器中某些功能正常但在设备上却没有。同一个设备(!)

的完全相同的代码的两个完全相同的部署也会轻微改变行为

昨天在MonoTouch论坛上发表了这篇文章,但那里似乎有点安静。

提前致谢。

1 个答案:

答案 0 :(得分:0)

透明,这与线程有关。通过在我的Elapsed事件处理程序中使用InvokeOnMainThread()来解决。