10 c# .net-4.5 mvvmcross xamarin
我正在使用Xamarin和MvvmCross构建跨平台应用程序.我需要每分钟调用服务器更新一次(稍后我将移动推送通知)但我无法在我的核心项目中制作计时器.我见过MvvmCross N + 42,但我相信目标项目较旧,允许计时器.以下是我的目标框架.
有没有更好的方法让我不断调用一个调用服务的方法?
@stevemorgan回答非常好.我基于该代码创建了一个Timer实用程序,使其更具可重用性.我还添加了一个"runOnce"参数,它将在第一次滴答后停止计时器
public class PclTimer
{
public bool IsRunning { get; private set; }
public TimeSpan Interval { get; set; }
public Action Tick { get; set; }
public bool RunOnce { get; set; }
public Action Stopped { get; set; }
public Action Started { get; set; }
public PclTimer(TimeSpan interval, Action tick = null, bool runOnce = false)
{
Interval = interval;
Tick = tick;
RunOnce = runOnce;
}
public PclTimer Start()
{
if (!IsRunning)
{
IsRunning = true;
Started?.Invoke();
var t = RunTimer();
}
return this;
}
public void Stop()
{
IsRunning = false;
Stopped?.Invoke();
}
private async Task RunTimer()
{
while (IsRunning)
{
await Task.Delay(Interval);
if (IsRunning)
{
Tick?.Invoke();
if (RunOnce)
{
Stop();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在MvvmCross中使用它没有任何问题:
timer = new Timer(TimeSpan.FromSeconds(4),
() => ShowViewModel<UserMatchViewModel>(), true)
.Start();
Run Code Online (Sandbox Code Playgroud)
由于 async/await 的神奇之处,你总是可以自己做:
public async Task RunTimer()
{
while(_timerRunning)
{
// Do Work
// ...
await Task.Delay(_timerInterval);
}
}
Run Code Online (Sandbox Code Playgroud)
当你打电话时,不要等待。它将在后台线程上运行,您可以通过从其他地方设置 _timerRunning 字段(或通过终止从调用返回的任务)来终止循环。