Посмотрите на этот фрагмент кода:
for (int i = 0; i < _workers.Length; ++i)
{
Task t1 = Task.Factory.StartNew(() =>
{
try
{
if (!_workers[i].Join(4000)) << == Here
LogWriter.Trace("Failed to join thread", "ThreadFailureOnDispose");
}
В _workers[i].Join(4000)
значение i
не то, что вы думаете.Попробуйте еще раз:
for (int i = 0; i < _workers.Length; ++i)
{
int j = i; // copy
Task t1 = Task.Factory.StartNew(() =>
{
try
{
if (!_workers[j].Join(4000)) // j
LogWriter.Trace("Failed to join thread", "ThreadFailureOnDispose");
}
В вашей версии перехватывается переменная 'i', и все задачи используют одну и ту же переменную.Все, кроме первых, увидят i == _workers.Length
, потому что они выполняются после завершения цикла for.
Это классическая лямбда + захваченная задача var.