c# Timer异常停止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# Timer异常停止相关的知识,希望对你有一定的参考价值。

public void OnStart()

t = new System.Timers.Timer();
t.Interval = 10000;//间隔时间为15S
t.Elapsed += new System.Timers.ElapsedEventHandler(ChkSrv);//到达时间的时候执行事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
//t.Stop(); 停止服务


/// <summary>
/// 定时检查,并执行方法
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
///
static object name = 0;
public void ChkSrv(object source, ElapsedEventArgs e)


t.Enabled = false;
t.Interval = 10000;//间隔时间为15S
lock (name)

name = Convert.ToInt32(name) + 1;
Thread.CurrentThread.Name = name.ToString();

//Console.WriteLine(DateTime.Now.ToString() + "-" + Thread.CurrentThread.Name);
//Thread.Sleep(1000000);
StatisticalData();
SetInnPointPo();//执行推送数据方法
SetInnPointApp();

t.Enabled = true;


执行ChkSrv()方法的时候会异常停止, IIS服务器

lock (thelock)

               name = Convert.ToInt32(name) + 1;
               Thread.CurrentThread.Name = name.ToString();//这里,只能给Name 属性赋值一次,不允许在 Name 属性不为null时对 它赋值



参考技术A 异常停止指什么?系统抛异常?还是说ChkSrv()不会继续运行下去?追问

ChkSrv()不会继续执行

追答

Timer工作原理是新开一个线程没错,但是 Thread.CurrentThread指的就是这个线程,你可以尝试这样做:

public void ChkSrv(object source, ElapsedEventArgs e)

Thread newThread = new Thread(new ThreadStart(newThreadFunc));
newThread.Start();


public void newThreadFunc()

lock (name)

name = Convert.ToInt32(name) + 1;
Thread.CurrentThread.Name = name.ToString();

//Console.WriteLine(DateTime.Now.ToString() + "-" + Thread.CurrentThread.Name);
//Thread.Sleep(1000000);
StatisticalData();
SetInnPointPo();//执行推送数据方法
SetInnPointApp();

Thread.Abort();


还要在其他地方做点操作,让timer动起来。

本回答被提问者采纳

c# timer停止不了,请问如何解决

下面是代码,检查一个进程,如果有就继续等待时间然后再检查,如果没有就启动一个进程,然后接着等到时间再检查,检查和等待还有启动都没问题,现在的问题是,有个按钮,点击停止timer,可是不管用,点击后,依然timer执行等待时间和检查,请问这个停止按钮该如何写
这一段是一个按钮点击开始计时的动做
private void button4_Click_1(object sender, EventArgs e)

button4.Text = ("监控中");
button4.Enabled = false ;
//到达时间的时候执行事件,周期为10秒;

System.Timers.Timer timer1 = new System.Timers.Timer(10 * 1000);
timer1.Elapsed += new System.Timers.ElapsedEventHandler(dz);
timer1.AutoReset = true; //设置一直执行(true)
timer1.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件
button5.Enabled = true;
这一段是到时间后的timer执行内容
public void dz(object source, System.Timers.ElapsedEventArgs e)

System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
bool isRunning = false;
foreach (System.Diagnostics.Process myProcess in myProcesses)

if ("test" == myProcess.ProcessName)

isRunning = true;
break;



if (!isRunning)

System.Diagnostics.Process.Start(@"D:\test\test.exe");



这个是那个停止按钮
private void button5_Click(object sender, EventArgs e)

timer1.Stop();
timer1.Enabled = false;
button5.Enabled = false;
button4.Enabled = true;
button4.Text = ("开始监控");



该如何改写才好呢,谢谢了

参考技术A timer的作用域不对,你是在button事件里创建的不能再外面用本回答被提问者采纳 参考技术B 建议在窗体上添加timer控件,而不是在事件中进行声明!

以上是关于c# Timer异常停止的主要内容,如果未能解决你的问题,请参考以下文章

C# winform中timer函数如何停止,点运行后可再次启动周期事件

C# System.Threading.Timer如何停止

C# winform中timer函数如何停止,点运行后可再次启动周期事件

C#:异常后停止线程

如何停止 System.Threading.Timer,然后更改其参数并再次运行? [复制]

当窗口全屏或很大时,为啥 System.Windows.Forms.Timer 会自动停止?