Отложеный запуск потока с параметрами - C#

Узнай цену своей работы

Формулировка задачи:

Есть несколько устройств, для работы с которыми создается соответствующее число потоков. Потоки складирую в Dictionary, после этого в нужное время запускаю. Собственно код-пример:
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 + ", ";
    }));
}
При клике на button2 в текстбоксе logtb появляется "Device 2, Device 2". Нужно, чтобы было "Device 1, Device 2". Вопрос - как это реализовать? Также не доконца понимаю, почему результат именно "2, 2". Если можно, объясните на пальцах плз. Если вместо delegate() { DoWork(device); }) сделать new ParameterizedThreadStart(DoWork), а метод DoWork сделать принимающим в качестве параметра object, то все начинает работать как надо, но проблемма в том, что передать параметры я могу только при нажатии на button1, т.е. параметров запуска в методе button2_Click у меня нет.

Решение задачи: «Отложеный запуск потока с параметрами»

textual
Листинг программы
foreach (string device in Devices)
{
        var d = device;
        deviceThreads.Add(device, new Thread(delegate() { DoWork(d); }));
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5