4

我在 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 方法。这两个事件都是独立的,并且在随机时间退出(至少我没有找到任何规则)

是什么导致了这种情况,我该如何预防?

4

2 回答 2

4

如果您不保留对计时器对象的引用,它将被垃圾收集。

查看您发布的代码,您似乎没有保留参考。您需要将其设置为包含类中的字段,而不是局部变量。

如果您在长时间运行的方法开始时声明计时器并且稍后在方法中不引用它,则计时器也可以进行垃圾收集。

您可以通过在此处描述GC.KeepAlive(timer);的方法末尾附近添加来解决该特定问题。

于 2013-04-17T08:07:08.410 回答
3

听起来定时器正在收集垃圾。使其成为表单的实例变量,以便您可以保留引用。

于 2013-04-17T08:06:26.470 回答