我在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


基础教程推荐
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16
- C#中的Linq to JSON操作详解 2023-06-08
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C#中 Json 序列化去掉null值的方法 2022-11-18
- Unity shader实现高斯模糊效果 2023-01-16
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- C# 解析XML和反序列化的示例 2023-04-14
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- 实例详解C#实现http不同方法的请求 2022-12-26