该线程已退出Windows窗体中的代码0
我在Windows窗体中退出线程时遇到问题。
我有经典的Windows窗体,它正在运行。 我需要在每个时间段做一些事情,所以我补充说:
TimerCallback timerDelegate = new TimerCallback(this.TryDoSomething); int period = 10 * 1000; // to miliseconds System.Threading.Timer stateTimer = new System.Threading.Timer(timerDelegate, null, period, period);
方法DoSomething由几个线程(主线程和这个计时器)调用,所以我这样覆盖它:
private void TryDoSomething(object o) { lock (tryDoSomethingMutex) { if (this.dataGridView1.InvokeRequired) { RefreshCallback d = new RefreshCallback(DoSomething); this.Invoke(d, new object[] { o }); } else { this.DoSomething(o); } } }
一切都很好,直到我的计时器线程退出时带有消息:
The thread 0x2798 has exited with code 0 (0x0).
同样的事情发生在我的FileSystemWatcher上,它也调用了DoSomething方法。 这两个事件都是独立的,随机退出(至少我没有找到任何规则)
导致这种情况的原因是什么,我该如何预防呢?
如果不保留对计时器对象的引用,则将对其进行垃圾回收。
查看您发布的代码,似乎您没有保留引用。 您需要在包含的类中创建一个字段,而不是局部变量。
如果您在长时间运行的方法的开头声明它并且稍后在方法中不引用它,那么计时器也可以收集垃圾。
您可以通过添加GC.KeepAlive(timer);
来解决该特定问题GC.KeepAlive(timer);
接近这里描述的方法的结尾。
听起来好像Timer正在收集垃圾。 使其成为表单的实例变量,以便您可以保留引用。