Thread.Join强行关闭应用程序端的线程

时间:2016-05-27 22:19:28

标签: c# multithreading join using

我有一个实现IDisposable的类。该类包含一个线程,并使用Thread.Join(...)

在Dispose方法中关闭该线程

我的问题是,如果我像这样运行我的课程:

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等待完成。

1 个答案:

答案 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而后者等待线程完成执行,因此您的应用程序不会过早退出。