我遇到问题,在我的设备上大部分时间,但不是全部时间,在发布模式下编译时,我的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论坛上发表了这篇文章,但那里似乎有点安静。
提前致谢。
答案 0 :(得分:0)
透明,这与线程有关。通过在我的Elapsed事件处理程序中使用InvokeOnMainThread()来解决。