gpt4 book ai didi

c# - 尝试实现计时器并每 x 秒执行一次任务,但任务似乎被延迟

转载 作者:行者123 更新时间:2023-11-29 05:31:11 49 4
gpt4 key购买 nike

我正在编写一个应用程序,用户可以在其中指定时间长度、间隔长度以及间隔之间的时间长度。我想要一个计时器标签向用户显示总时间,但我也想要一个显示工作状态的标签(记录是否在间隔内,如果在间隔时间和休息结束之间则记录)。

示例:总时间 = 2 分钟,间隔 = 20 秒,休息 = 10 秒

在此示例中,将有 4 个间隔。因此,从 0:00-0:19 我想显示“录音”,然后从 0:20-0:29 我想显示中断,然后从 0:30-0:49 我显示“录音”和 0:50 -0:59 我显示“Break”等。计时器一直在计时。

所以我认为这非常简单,但似乎发生的情况是计时器正确递增,但在第一个间隔之后,标签直到 0:31 或 0:32 才从中断切换到记录,因此看起来有点延迟。

这是我当前正在使用的代码(注意 obs 是我传入的对象,其中包含来自用户输入的数据)。

int TotalInterval = obs.Interval + obs.Break;
int WorkingInterval = obs.Interval;
int NumberOfIntervals = (obs.Duration*60) / TotalInterval;
DateTime ObservationEnd = obs.DateCreated.AddMinutes(obs.Duration);

Timer.Text = "Starting Timer";
int minutes = 0;
int seconds = 0;
int InIntervalCounter = 0;
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
{
// called every 1 second
Timer.Text = "Started";

if (ObservationEnd < DateTime.UtcNow)
{
Timer.Text = "Time Over";
Results.IsVisible = true;
return false;
}
else
{
seconds++;
InIntervalCounter++;

if (InIntervalCounter > WorkingInterval)
IntervalOrBreak.Text = "Break";

if (InIntervalCounter > TotalInterval)
{
IntervalOrBreak.Text = "Recording";
InIntervalCounter = 0;
}
Timer.Text = "Time: " + minutes + ":" + seconds.ToString("D2");

return true;
}
});

我对应用程序开发/xamarin 还很陌生,因此非常感谢您的帮助。

最佳答案

尝试将简单的线程与 Thead.sleep() 一起使用,如下所示:

 final long delay_millis = 100;
Thread thread_something;

thread_something = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
long start_time = SystemClock.elapsedRealtime();

// Do some task

long time_need_for_delay = (start_time + delay_millis) - SystemClock.elapsedRealtime();

if(time_need_for_delay > 0)
thread_something.sleep(time_need_for_delay);

} catch (Exception e) { }
}
}
});

thread_something.start();

关于c# - 尝试实现计时器并每 x 秒执行一次任务,但任务似乎被延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57549504/

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