gpt4 book ai didi

xamarin - 如何在完成之前取消计时器

转载 作者:行者123 更新时间:2023-12-01 07:35:12 25 4
gpt4 key购买 nike

我正在开发一个聊天应用程序。加载聊天消息并且消息可见 5 秒后,我想向服务器发送阅读确认。这是我到目前为止想出的:

public async void RefreshLocalData()
{
// some async code to load the messages

if (_selectedChat.countNewMessages > 0)
{
Device.StartTimer(TimeSpan.FromSeconds(5), SendReadConfirmation);
}
}
RefreshLocalData()被调用,我知道用户选择了另一个聊天,或者当前聊天有新消息。所以当 RefreshLocalData()被调用时,我必须取消当前计时器才能开始新的计时器。
我必须取消计时器的另一种情况是当我导航到另一个 Page 时.这没有问题,因为整个 ViewModel发生这种情况时会被处理掉。
使用上面的代码,如果 RefreshLocalData()再次被调用,但声明 TimeSpan 5秒还没结束,方法还在执行。
有没有办法取消计时器(如果再次调用 RefreshLocalData())?

最佳答案

我在 Xamarin 论坛中找到了这个答案:https://forums.xamarin.com/discussion/comment/149877/#Comment_149877

我对其进行了一些更改以满足我的需求,并且此解决方案正在起作用:

public class StoppableTimer
{
private readonly TimeSpan timespan;
private readonly Action callback;

private CancellationTokenSource cancellation;

public StoppableTimer(TimeSpan timespan, Action callback)
{
this.timespan = timespan;
this.callback = callback;
this.cancellation = new CancellationTokenSource();
}

public void Start()
{
CancellationTokenSource cts = this.cancellation; // safe copy
Device.StartTimer(this.timespan,
() => {
if (cts.IsCancellationRequested) return false;
this.callback.Invoke();
return false; // or true for periodic behavior
});
}

public void Stop()
{
Interlocked.Exchange(ref this.cancellation, new CancellationTokenSource()).Cancel();
}

public void Dispose()
{

}
}

这就是我在 RefreshLocalData() 中使用它的方式方法:
private StoppableTimer stoppableTimer;

public async void RefreshLocalData()
{
if (stoppableTimer != null)
{
stoppableTimer.Stop();
}

// some async code to load the messages

if (_selectedChat.countNewMessages > 0)
{
if (stoppableTimer == null)
{
stoppableTimer = new StoppableTimer(TimeSpan.FromSeconds(5), SendReadConfirmation);
stoppableTimer.Start();
}
else
{
stoppableTimer.Start();
}
}
}

关于xamarin - 如何在完成之前取消计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41586553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com