【发布时间】:2016-05-30 23:10:17
【问题描述】:
我有一个实现 IDisposable 的类。该类包含一个线程,该线程在 Dispose 方法中使用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 语句是什么?
我的预感是使用第一种方法,因为应用程序已经退出,它会强制关闭线程而不等待它完成。但是,在 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 或使用 using 块,突然 Thread.Join 按预期工作。为什么?
TLDR;
当通过终结器调用 Dispose 时,Thread.Join 不会等待完成。当显式调用 dispose 时(通过手动调用它或使用 using 语句),Thread.Join 等待完成。
【问题讨论】:
-
你班的线程是后台线程吗?如果它是前台线程,那么在这两种情况下,调用线程都应该等到子线程完成。如果它是后台线程,那么 Thread.Join() 会强制主线程等待子线程完成。否则它会在不等待子线程的情况下完成。
-
@PiotrWolkowski 这是一个后台线程。但是当我将其更改为前台线程时。它退出的速度更快:/
-
如果您至少可以显示您的
MyClass的一些代码,那将很有帮助。尤其是创建和启动线程的方法以及使用Thread.Join的部分。 -
@PiotrWolkowski 已更新。
标签: c# multithreading join using