Tag: 计时器

计时器比System.Threading.Timer更可靠

我目前正以10秒的间隔使用System.Threading.Timer。 每次计时器触发时,我都会添加一小段代码写入文件,而且大部分时间它会按时触发,有时候(可能是当应用程序的其余部分被购买时),无法触发30或40秒,并连续快速地反复射击。 我可以在.NET 3.5中使用更可靠的计时器吗? 定时器的设置如下 Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000); …回调是: private static void SomeMethod(object state) 但是,提供比此更多的代码是很困难的,因为Timer通常会正确触发。 当它嵌入一个大型应用程序(约100,000行左右)时,多个线程被射击,左,右和中心,你慢慢开始看到计时器间歇性地发射。 我看过几篇post暗示ThreadPool可能已经筋疲力尽了,所以我现在正在调查,看看这可能是我遇到的情况。

当我的计时器滴答… .NET内存泄漏

我有一个.NET System.Threading.Timer计时器,每隔60秒滴答一次,并在每个tick上引入内存泄漏。 在计时器的每个刻度上,代码分配一个IDisposable对象(称为SocketsMessageConnector)……但我确实正确处理它。 我运行了.NET Memory Profiler,每60秒我看到一个新的SocketsMessageConnector类实例在内存中停留(所以在15分钟后,我有15个实例)。 内存分析器validation实例是否已被释放,但它显示了一个以TimerCallback为根的实例,该实例以_TimerCallback为根,该查询以GCHandle为根… 什么在这里? 为什么TimerCallback保持在每个计时器滴答上创建的新实例? PS。 在拍摄快照之前,探查器强制2个GC,所以我知道它实际上是泄漏而不仅仅是GC的优化。

如何在特定时间间隔后运行方法?

很明显:例如,想象一下我的表格中的一个按钮。 当用户单击该按钮时,某些void方法应在30秒后运行。 会有一个DoAfterDelay两个输入参数的void方法DoAfterDelay 。 第一个是要做的方法(使用委托),另一个是时间间隔。 所以我会: public delegate void IVoidDelegate(); static void DoAfterDelay(IVoidDelegate TheMethod, TimeSpan Interval) { // *** Some code that will pause the process for “Interval”. TheMethod(); } 所以,我只需要一段代码来暂停特定时间间隔的过程。 到目前为止,我使用此代码执行此操作: System.Threading.Thread.Sleep(Interval); 但是这段代码对我没有好处,因为它会停止整个过程并冻结程序。 我不希望程序卡在DoAfterDelay方法中。 这就是Thread.Sleep没用的原因。 所以有人可以提出更好的方法吗? 当然我已经搜索过了,但我发现的大部分解决方案都是基于使用计时器(比如这里 )。 但是使用计时器是我最后的意见,因为该方法应该运行一次并且使用计时器会使程序混淆阅读。 所以,如果有的话,我正在寻找更好的解决方案。 或许我必须使用计时器? 我想我必须玩线程,但不确定。 所以我想知道是否有人可以指导我找到解决方案。 提前致谢。

C#在X秒后执行动作

我想开发一个Windows控制台应用程序,它在给定时间后定期执行一个动作。 我已经读过某个计时器类只适用于Windows窗体应用程序,那么实现我想要的最佳方法是什么?

使用System的简单示例。 计时器。 C#中的定时器

我阅读了MSDN网站和一切,但我找不到关于如何引发定时事件的简单解释,该事件接受可以是string或double精度的参数。 提供的示例使用ElapsedEventArgs但没有显示实现我自己的参数的好方法。 我的代码(我没有测试过可能是错的): private double Pressure_Effect(double p, int t){ time=(double) t; v=(((p/(rho*y))-g)*time)/(1.0+(mu*time/(rho*y*x))); return v; } private void Time_Handle(){ System.Timers.Timer startTimer=new System.Timers.Timer(70); startTimer.Elapsed += new ElapsedEventHandler(Activate_Pressure); } private void Activate_Pressure(object source, ElapsedEventArgs e){ pressure=2.5; double v=Pressure_Effect(pressure, 70); } 我想要做的是Activate_Pressure是多余的感觉,如果我可以直接将事件传递给Pressure_Effect ,我不知道如何。 我是C#的新手,所以请耐心等待。 我知道我没有启用计时器,而且此代码中可能缺少其他关键部分,但我刚发布它以使我的问题清楚。

使用Timer将操作延迟几秒钟

我试图通过使用计时器来延迟我的方法: private System.Timers.Timer _delayTimer; private void delay() { _delayTimer = new System.Timers.Timer(); _delayTimer.Interval = 5000; //_delayTimer.Enabled = true; _delayTimer.Elapsed += _delayTimer_Elapsed; _delayTimer.Start(); someMethod(); } } private void _delayTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { // delay for 5 seconds } 当我进入delay()方法时,我想启动计时器,而不是我想要5秒延迟,只有在那之后我想执行someMethod()并且当前这不会发生,执行delay()之后执行someMethod()没有5秒延迟

在处置后监控多个Threading.Timers

我有一个进程,它创建一个动态的定时器列表(System.Threading.Timer)并继续运行,直到收到一个信号终止。 一旦收到信号终止,我希望任何现有的定时器回调完成(见下文): private IList _timers = new List(); … … private void WaitOnExecutingThreads() { var waiters = new List(_timers.Count); foreach (var timer in _timers) { var onWait = new ManualResetEvent(false); waiters.Add(onWait); timer.Dispose(onWait); } WaitHandle.WaitAll(waiters.ToArray()); waiters.ForEach(x=> x.Dispose()); } 此代码现在可以正常工作,但是我希望在处理定时器后监视正在进行的线程回调。 我的意图是以给定间隔写入日志“定时器A仍在运行”。 我开始玩: ThreadPool.RegisterWaitForSingleObject(….) add添加了以下内容:(注意:我创建了一个包含计时器和关联数据的ThreadContext类) private void WaitOnExecutingThreads() { var waiters = new List(); WaitOrTimerCallback IsRunning = (x, […]

网络应用上的计时器

我希望我的网站(C#)每15分钟调用异步到一些c#函数我该怎么做? 谢谢

C#睡眠500毫秒

你能否告诉我如何暂停我的程序500毫秒然后继续? 我读Thread.Sleep(500)并不好,因为它阻止了GUI线程。 使用计时器它会触发回调…… 我只想等待500毫秒然后继续下一个声明。 请指教。 编辑:我需要显示状态栏消息500毫秒,然后用另一个消息更新消息。 对不起,我的意思是500不是50。 编辑:我明白你所说的一切。 但是:[我只想等待500ms,然后继续下一个声明。]我认为因为它是如此短暂的间隔我将在主GUI线程上执行Thread.Sleep(500)。 否则我将不得不重写大量代码以适应500毫秒的这个短暂间隔。 编辑:我将尝试重新格式化我的状态消息,因此不需要暂停。

如何防止System.Timers.Timer排队在线程池上执行?

标准System.Timers.Timer行为存在问题。 计时器以某个间隔提升Elapsed事件。 但是当Elapsed事件处理程序内的执行时间超过计时器间隔时,线程池开始排队事件处理。 这是我的问题。 这是因为使用我的Elapsed事件处理程序,我从数据库中获取一些数据并使用它做一些事情,最后将结果保存回数据库。 但是数据处理应该只提供一次。 那么,有没有办法防止排队System.Timers.Timer的elapse事件。 作为此问题的插图,您可以考虑下一个测试程序: public class EntryPoint { private static void TimeProc(object state, ElapsedEventArgs e) { Console.WriteLine(“Current time {0} on the thread {1}”, DateTime.Now, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(20000); } static void Main(string[] args) { Console.WriteLine(“Press for finishing\n\n”); ThreadPool.SetMaxThreads(10, 10); System.Timers.Timer MyTimer = new System.Timers.Timer(1000); MyTimer.Elapsed += new ElapsedEventHandler(TimeProc); MyTimer.Start(); Console.ReadLine(); MyTimer.Stop(); } } […]