c# – 线程已退出,Windows窗体中的代码为0

我在Windows窗体中退出线程时遇到问题.我有经典的Windows窗体,它正在运行.我需要在每个时期做一些事情,所以我补充说:TimerCallback timerDelegate = new TimerCallback(this.TryDoSomething);int period = 10 * 1...

我在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(计时器)来解决该特定问题;接近方法as described here的末尾.

本文标题为:c# – 线程已退出,Windows窗体中的代码为0

基础教程推荐