标签: timer

C#每隔X分钟运行一个线程,但前提是该线程尚未运行

我有一个C#程序需要每隔X分钟调度一个线程,但前提是先前调度的线程(从X分钟开始)以前还没有运行.

Timer单独一个普通的老人将无法工作(因为无论是否先前已发送的流程已完成,它每X分钟发送一次事件).

将要发送的进程在执行任务所花费的时间内变化很大 - 有时可能需要一秒钟,有时可能需要几个小时.如果它从上次启动时仍在处理,我不想再次启动该过程.

谁能提供一些有用的C#示例代码?

c# timer

62
推荐指数
4
解决办法
5万
查看次数

为什么.NET计时器的分辨率限制在15毫秒?

请注意,我要问的是,使用类似的东西,每隔15毫秒就会调用一次回调函数System.Threading.Timer.我不是在询问如何使用类似System.Diagnostics.Stopwatch甚至是类似的东西准确计算代码QueryPerformanceCounter.

另外,我已经阅读了相关问题:

准确的Windows计时器?System.Timers.Timer()限制为15毫秒

.NET中的高分辨率计时器

这些都没有为我的问题提供有用的答案.

此外,推荐的MSDN文章" 为Windows实现连续更新,高分辨率时间提供程序"是关于计时而不是提供连续的滴答流.

照这样说...

关于.NET计时器对象有很多不好的信息.例如,System.Timers.Timer被称为"针对服务器应用程序优化的高性能计时器".并且System.Threading.Timer在某种程度上被认为是二等公民.传统的观点认为,System.Threading.Timer是围绕Windows的包装定时器队列定时器,并且System.Timers.Timer完全是另一回事.

现实情况大不相同. System.Timers.Timer只是一个瘦的组件包装器System.Threading.Timer(只需使用Reflector或ILDASM来查看内部System.Timers.Timer,你会看到引用System.Threading.Timer),并有一些代码将提供自动线程同步,所以你不必这样做.

System.Threading.Timer事实证明,它不是 Timer Queue Timers的包装器.至少不在2.0运行时,它是从.NET 2.0到.NET 3.5使用的.使用Shared Source CLI几分钟后,运行时会实现自己的定时器队列,类似于Timer Queue Timers,但实际上从不调用Win32函数.

似乎.NET 4.0运行时还实现了自己的计时器队列.我的测试程序(见下文)在.NET 4.0下提供与.NET 3.5相似的结果.我已经为Timer Queue Timers创建了自己的托管包装器并证明我可以获得1 ms的分辨率(具有相当好的准确性),所以我认为我不太可能错误地读取CLI源代码.

我有两个问题:

首先,是什么原因导致运行时计时器队列的实现如此缓慢?我的分辨率不能超过15毫秒,精度似乎在-1到+30毫秒的范围内.也就是说,如果我要求24毫秒,我会在23到54毫秒之间的任何地方得到滴答声.我想我可以花更多时间使用CLI源来追踪答案,但我想这里有人可能知道.

其次,我意识到这很难回答,为什么不使用定时器队列定时器?我意识到.NET 1.x必须在没有这些API的Win9x上运行,但它们自Windows 2000以来就存在,如果我没记错的话,那就是.NET 2.0的最低要求.是因为CLI必须在非Windows机器上运行吗?

我的计时器测试程序:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;

namespace TimerTest
{
    class Program
    {
        const int TickFrequency = 5; …
Run Code Online (Sandbox Code Playgroud)

.net timer

61
推荐指数
2
解决办法
3万
查看次数

Javascript:在特定时间段后调用函数

在JavaScript中,如何在特定时间间隔后调用函数?

这是我想要运行的函数:

function FetchData() {
}
Run Code Online (Sandbox Code Playgroud)

javascript function timer

59
推荐指数
4
解决办法
12万
查看次数

使用Thread.Sleep和Timer进行比较以延迟执行

我有一个方法应该延迟运行指定的时间.

我应该用吗?

Thread thread = new Thread(() => {
    Thread.Sleep(millisecond);
    action();
});
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)

要么

Timer timer = new Timer(o => action(), null, millisecond, -1);
Run Code Online (Sandbox Code Playgroud)

我读过一些关于使用的文章Thread.Sleep是糟糕的设计.但我真的不明白为什么.

但是对于使用Timer,Timer有配置方法.由于执行延迟,我不知道如何配置Timer.你有什么建议吗?

或者如果你有延迟执行的替代代码也很感激.

c# multithreading sleep timer delayed-execution

56
推荐指数
3
解决办法
6万
查看次数

iOS在不活动一段时间后执行操作(无用户交互)

如何在基于用户交互(或缺少用户交互)的iOS应用程序中添加计时器?换句话说,如果2分钟内没有用户交互,我想让应用程序执行某些操作,在这种情况下导航到初始视图控制器.如果在1:55有人触摸屏幕,则计时器重置.我认为这需要一个全局计时器,所以无论你在哪个视图,缺乏交互启动计时器.虽然,我可以在每个视图上创建一个独特的计时器.有没有人有任何建议,链接或示例代码,以前这样做过?

xcode timer ios

56
推荐指数
3
解决办法
5万
查看次数

如何计算java中事件的经过时间?

使用Java访问系统时钟的简单/简单方法是什么,以便我可以计算事件的已用时间?

java timer clock

54
推荐指数
5
解决办法
5万
查看次数

可靠地停止System.Threading.Timer?

好吧,我已经搜索了很多解决方案.我正在寻找一种干净简单的方法来防止在我停止后调用System.Threading.Timer的回调方法.

我似乎无法找到任何东西,这导致我,在偶尔,诉诸可怕的线程 - thread.sleep-thread.abort组合颤抖.

可以用锁来完成吗?请帮我找到一个好办法.谢谢

c# multithreading timer

53
推荐指数
5
解决办法
7万
查看次数

等待几秒钟而不阻止UI执行

我想在两条指令之间等待几秒钟,但没有阻止执行.

例如,Thread.Sleep(2000)它不好,因为它会阻止执行.

我的想法是,我调用一个方法,然后等待X秒(例如20)监听一个事件.在20秒结束时,我应该根据20秒内发生的事情进行一些操作.

c# timer wait

53
推荐指数
4
解决办法
9万
查看次数

如何确定Timer是否正在运行?

如果我有一个具有较长间隔的System.Timers.Timer实例 - 例如1分钟,如何在不等待Tick的情况下查明它是否已启动?

.net timer

51
推荐指数
4
解决办法
6万
查看次数

如何立即触发timer.Elapsed事件

我正在使用System.Timers.Timer该类创建一个带有Timer.Elapsed事件的计时器.事情是Timer.Elapsed只有在间隔时间过去之后才会首次触发事件.

有没有办法Timer.Elapsed在启动计时器后立即举起活动?

我在System.Timers.Timer课堂上找不到任何相关的财产.

c# events timer

51
推荐指数
6
解决办法
6万
查看次数

标签 统计

timer ×10

c# ×5

.net ×2

multithreading ×2

clock ×1

delayed-execution ×1

events ×1

function ×1

ios ×1

java ×1

javascript ×1

sleep ×1

wait ×1

xcode ×1