Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未命名计时器线程不';不执行_C#_Multithreading - Fatal编程技术网

C# 未命名计时器线程不';不执行

C# 未命名计时器线程不';不执行,c#,multithreading,C#,Multithreading,想知道是否有人能回答困扰我的问题 我有一个计时器,它设置一个变量,让其他线程知道何时停止执行(本例中的长度是硬编码的) 我从不加入线程,也不使用timers变量名,所以我“清理”了它,说: new Timer(x => _endOfProcessingTimeHasElapsed = true, null, 10000, 0); 这可以很好地编译,但线程从不执行 有人知道为什么吗?可能是因为您从未持有对您创建的对象的引用,所以它要么立即得到优化(没有左值),要么只是得到GC’d,永远不会

想知道是否有人能回答困扰我的问题

我有一个计时器,它设置一个变量,让其他线程知道何时停止执行(本例中的长度是硬编码的)

我从不加入线程,也不使用timers变量名,所以我“清理”了它,说:

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);