我在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
基础教程推荐
- unity实现动态排行榜 2023-04-27
- C#控制台实现飞行棋小游戏 2023-04-22
- C# 调用WebService的方法 2023-03-09
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C#类和结构详解 2023-05-30
- C# List实现行转列的通用方案 2022-11-02
- winform把Office转成PDF文件 2023-06-14
- 一个读写csv文件的C#类 2022-11-06
- C# windows语音识别与朗读实例 2023-04-27
- ZooKeeper的安装及部署教程 2023-01-22