Отложеный запуск потока с параметрами - C#
Формулировка задачи:
Есть несколько устройств, для работы с которыми создается соответствующее число потоков. Потоки складирую в Dictionary, после этого в нужное время запускаю.
Собственно код-пример:
При клике на button2 в текстбоксе logtb появляется "Device 2, Device 2". Нужно, чтобы было "Device 1, Device 2".
Вопрос - как это реализовать? Также не доконца понимаю, почему результат именно "2, 2". Если можно, объясните на пальцах плз.
Если вместо delegate() { DoWork(device); }) сделать new ParameterizedThreadStart(DoWork), а метод DoWork сделать принимающим в качестве параметра object, то все начинает работать как надо, но проблемма в том, что передать параметры я могу только при нажатии на button1, т.е. параметров запуска в методе button2_Click у меня нет.
Dictionary<string, Thread> deviceThreads = new Dictionary<string, Thread>();
string[] Devices = new string[] { "Device 1", "Device 2" };
private void button1_Click(object sender, EventArgs e)
{
foreach (string device in Devices)
deviceThreads.Add(device, new Thread(delegate() { DoWork(device); }));
}
private void button2_Click(object sender, EventArgs e)
{
foreach (string device in Devices)
{
deviceThreads[device].IsBackground = true;
deviceThreads[device].Start();
}
}
public void DoWork(string deviceID)
{
Thread.Sleep(2000);
Log(deviceID);
}
private void Log(string str)
{
logtb.BeginInvoke(new Action(delegate()
{
logtb.Text += str + ", ";
}));
}Решение задачи: «Отложеный запуск потока с параметрами»
textual
Листинг программы
foreach (string device in Devices)
{
var d = device;
deviceThreads.Add(device, new Thread(delegate() { DoWork(d); }));
}