C# 未命名计时器线程不';不执行
想知道是否有人能回答困扰我的问题 我有一个计时器,它设置一个变量,让其他线程知道何时停止执行(本例中的长度是硬编码的) 我从不加入线程,也不使用timers变量名,所以我“清理”了它,说:C# 未命名计时器线程不';不执行,c#,multithreading,C#,Multithreading,想知道是否有人能回答困扰我的问题 我有一个计时器,它设置一个变量,让其他线程知道何时停止执行(本例中的长度是硬编码的) 我从不加入线程,也不使用timers变量名,所以我“清理”了它,说: new Timer(x => _endOfProcessingTimeHasElapsed = true, null, 10000, 0); 这可以很好地编译,但线程从不执行 有人知道为什么吗?可能是因为您从未持有对您创建的对象的引用,所以它要么立即得到优化(没有左值),要么只是得到GC’d,永远不会
new Timer(x => _endOfProcessingTimeHasElapsed = true, null, 10000, 0);
这可以很好地编译,但线程从不执行
有人知道为什么吗?可能是因为您从未持有对您创建的对象的引用,所以它要么立即得到优化(没有左值),要么只是得到GC’d,永远不会执行
FWIW那个类不实现IDisposable吗?如果是这样,您应该使用
使用语句或调用dispose。可能是因为您从未持有对所创建对象的引用,所以它要么立即得到优化(没有左值),要么只是得到GC’d,永远不会执行
FWIW那个类不实现IDisposable吗?如果是这样,您应该使用using
语句或调用dispose
这可以很好地编译,但线程从不执行
匿名计时器可能在触发之前由垃圾收集器清除
看这个
这可以很好地编译,但线程从不执行
匿名计时器可能在触发之前由垃圾收集器清除
看这个。我猜计时器超出了范围,在10秒结束前被GCD。从MSDN:
只要使用计时器,就必须保留对它的引用。与任何托管对象一样,当没有对计时器的引用时,计时器将接受垃圾收集。计时器仍处于活动状态这一事实并不妨碍对其进行收集
解决方案是通过将该引用分配给某个类或表单属性/字段,将其保持在10秒(或任何时候)内的任何代码级别。我猜计时器超出范围,并在10秒之前被GCed。从MSDN:
只要使用计时器,就必须保留对它的引用。与任何托管对象一样,当没有对计时器的引用时,计时器将接受垃圾收集。计时器仍处于活动状态这一事实并不妨碍对其进行收集
解决方案是通过将该引用分配给某个类或表单属性/字段,将其保持在10秒内(或任何时候)仍然存在的任何代码级别。首先:Timer
是IDisposable
,因此您应该使用计时器的变量名,至少要正确地处理它
并且:由于您不保留对所创建实例的任何引用,因此它符合垃圾收集的条件。由于计时器的内部使用终结器,因此在计时器有机会启动之前,终结器会被调用并被删除。(请注意,在第一种情况下,仅在命名的局部变量中保留引用是不够的,编译器可能会注意到根本没有使用该变量,并对实例进行垃圾收集。)
解决方案:保留引用并在使用完后立即调用Dispose()
。首先:Timer
是IDisposable
,因此您应该使用计时器的变量名,至少要正确地处理它
并且:由于您不保留对所创建实例的任何引用,因此它符合垃圾收集的条件。由于计时器的内部使用终结器,因此在计时器有机会启动之前,终结器会被调用并被删除。(请注意,在第一种情况下,仅在命名的局部变量中保留引用是不够的,编译器可能会注意到根本没有使用该变量,并对实例进行垃圾收集。)
解决方案:保留引用并在使用完后立即调用Dispose()
。我假设第一个(命名)计时器按预期工作?我假设第一个(命名)计时器按预期工作?
new Timer(x => _endOfProcessingTimeHasElapsed = true, null, 10000, 0);