尝试在类析构函数中运行异步操作失败。
这是代码:
public class Executor
{
public static void Main()
{
var c1 = new Class1();
c1.DoSomething();
}
}
public class Class1
{
public void DoSomething()
{
}
private int _i = 100;
private int _j = 100;
~Class1()
{
Task.Run(() => _j *= 2); //Does not progress _j
_i *= 2; //Progress _i from 100 to 200
Thread.Sleep(1000);
Console.WriteLine("In destructor. _i = " + _i);
Console.WriteLine("In destructor. _j = " + _j);
}
}
输出是:
In destructor. _i = 200
In destructor. _j = 100
下列的MSDN 上的析构函数页面 https://msdn.microsoft.com/en-us/library/66x5fx1b.aspx没有提到实例销毁的线程/异步方面。
那么有什么想法吗?
谢谢
在您的特定示例中,无法启动新线程,因为运行时正在终止并且应用程序域正在卸载。当应用程序域卸载时 - 它将运行所有终结器并关闭所有线程。您可以通过以下方式验证这一点:
Console.WriteLine("shutdown:" + Environment.HasShutdownStarted);
哪个会返回true
在你的情况下。如果您像这样修改示例:
class Program {
static void Main(string[] args) {
var c1 = new Class1();
c1.DoSomething();
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadKey();
}
}
public class Class1
{
public void DoSomething()
{
}
private volatile int _i = 100;
private volatile int _j = 100;
~Class1()
{
Console.WriteLine("shutdown:" + Environment.HasShutdownStarted);
Task.Run(() => _j *= 2); //Does not progress _j
//_i *= 2; //Progress _i from 100 to 200
Thread.Sleep(1000);
Console.WriteLine("In destructor. _i = " + _i);
Console.WriteLine("In destructor. _j = " + _j);
}
}
并在发布模式下进行优化编译 - 您将看到现在运行时不会终止,您的任务将运行良好。
显然你不应该在终结器中做这样的事情,但只是为了让你知道真正的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)