Кажется, проблема здесь: () => WorkerThread(tmpItem, i)
Я не привык к Func<>
, но, похоже, он работает как анонимный делегат в .NET 2.0. Таким образом, вы можете иметь ссылку на аргументы метода WorkerThread()
. Следовательно, их значения извлекаются позже (когда поток действительно выполняется).
В этом случае вы, возможно, уже находитесь на следующей итерации вашего основного потока ...
Попробуйте вместо этого:
var t = new Thread(new ParametrizedThreadStart(WorkerThread));
t.Start(new { ConfigurationItem = tmpItem, Index = i } );
[EDIT] Другая реализация. Более гибкий, если вам нужно передать новые параметры потоку в будущем.
private void startWorkerThreads()
{
int numThreads = config.getAllItems().Count;
int i = 0;
foreach (ConfigurationItem tmpItem in config.getAllItems())
{
i++;
var wt = new WorkerThread(tmpItem, i);
wt.Start();
//return t;
}
}
private class WorkerThread
{
private ConfigurationItem _cfgItem;
private int _mul;
private Thread _thread;
public WorkerThread(ConfigurationItem cfgItem, int mul) {
_cfgItem = cfgItem;
_mul = mul;
}
public void Start()
{
_thread = new Thread(Run);
_thread.Start();
}
private void Run()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10 * _mul);
}
this.Invoke((ThreadStart)delegate()
{
this.textBox1.Text += "Thread " + _cfgItem.name + " Complete!\r\n";
this.textBox1.SelectionStart = textBox1.Text.Length;
this.textBox1.ScrollToCaret();
});
}
}