У меня есть класс, который реализует IDisposable. Класс содержит нить и нить закрыта в методе Dispose с помощью Thread.Join(...)
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, который позволяет потоку завершить выполнение?
Моя догадка такова, что с первым методом, поскольку приложение вышло, оно принудительно закрывает поток, не дожидаясь его завершения. Тем не менее, в блоке использования приложение все еще работает, поэтому у него есть время, чтобы закрыть поток, а затем выйти из приложения.
Если моя догадка верна, вы можете сообщить мне, почему приложение не дожидалось завершения потока до закрытия?
Edit:
~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();
}
Как вы можете видеть, с указанным кодом. Метод Shutdown вызывается в Dispose. Если я НЕ ВЫПОЛНИТЬ Утилиту явно, и я НЕ использую используемый блок, метод Thread.Join закрывается без завершения. Однако, если я вызываю Dispose explicity или использую блок using, вдруг Thread.Join работает так, как ожидалось. Зачем?
TLDR;
Когда Dispose вызывается через финализатор, Thread.Join не ждет завершения. Когда утилита явно вызывается (посредством ручного вызова ее или с помощью оператора using), Thread.Join ждет завершения.
http://stackoverflow.com/questions/212198/what-is-the-c-sharp-using-block-and-why-should-i-use-it –
Является ли поток в вашем классе фоновым потоком ? Если это поток переднего плана, то в обоих случаях вызывающий поток должен ждать окончания дочернего потока. Если это фоновый поток, то Thread.Join() заставляет основной поток ждать завершения дочернего потока. В противном случае он заканчивается без ожидания дочерних потоков. – PiotrWolkowski
@PiotrWolkowski Это фоновый поток. Но когда я меняю его на передний план.Он выходит еще быстрее:/ – CodingMadeEasy