我有一个实现IDisposable的类。该类包含一个线程,并使用Thread.Join(...)
我的问题是,如果我像这样运行我的课程:
static void Main(string[] args)
{
var class = new MyClass();
class.Run();
}
当应用程序关闭时,它强制关闭线程而不等待它完成执行。
但是,如果我像这样运行它:
static void Main(string[] args)
{
using (var class = new MyClass())
{
class.Run();
}
}
线程完成它的开始和优雅结束。什么是使用语句,允许线程完成执行?
我的预感是,使用第一种方法,因为应用程序已退出,它强制关闭线程而不等待它完成。但是,在using块下,应用程序仍在运行,因此它有时间关闭线程然后退出应用程序。
如果我的预感是正确的,你可以让我知道为什么应用程序不会在关闭之前等待完成的线程吗?
编辑:
~ElasticBase()
{
Dispose(false);
}
public virtual void Initialize()
{
workerThread = new Thread(ProcessData)
{
Name = "ElasticBase thread",
IsBackground = true
};
IsInitialized = true;
}
public virtual void Shutdown()
{
if (workerThread.IsAlive)
{
IsInitialized = false;
lock (syncObject)
{
if (!workerThread.Join(10000))
{
workerThread.Abort();
}
workerThread = null;
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool calledFromDispose)
{
Shutdown();
}
正如您在上面的代码中看到的那样。在Dispose中调用Shutdown方法。如果我不明确地调用Dispose并且我不使用using块,则Thread.Join方法将关闭而不会完成。但是,如果我确实调用Dispose explicity或使用using块,突然Thread.Join按预期工作。为什么?
TLDR;
当通过终结器调用Dispose时,Thread.Join不会等待完成。当显式调用dispose时(通过手动调用或使用using语句),Thread.Join等待完成。
答案 0 :(得分:-1)
你遗漏了两条信息:
Thread.Join
未关闭该帖子。而是等待线程完成执行。using
只是在Dispose
块中调用try/finally
方法的语法糖。为简单起见,您的代码相当于:
MyClass class = null;
try
{
class = new MyClass();
class.Run();
}
finally
{
if (class != null)
{
class.Dispose();
}
}
由于您的Dispose
方法调用Thread.Join
而后者等待线程完成执行,因此您的应用程序不会过早退出。