Передача параметров пулу потоков - C#

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

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

Добрый день Всем) В общем столкнулся с трудностью передачи параметров в пул потоков.
class Program
    {
        static void Main()
        {
                for (int i = 0; i < 20; i++)
                ThreadPool.QueueUserWorkItem(JobForAThread);  // это работает, когда не передаём никакой параметр
                ThreadPool.QueueUserWorkItem(new WaitCallback(JobForAThread(5)));  //так и никак не работает, если появляется параметр.
            
            Console.ReadLine();
        }
 
        static void JobForAThread(object state)   //должно быть всё в порядке - тип переменной object
        {
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine("цикл {0}, выполнение внутри потока из пула {1}",
                    i, Thread.CurrentThread.ManagedThreadId);
                Console.WriteLine(state);           
            }
Если всё же это невозможно, тогда прошу подсказать приём, которым можно открыть множество потоков(массив потоков?):
public class Potoc
        {
            Thread thrd; //поток для сложного устройства
            public Potoc(string name, int ID) //Конструктор получает имя функции-потока и ID устройства
            {
                thrd = new Thread(this.Loker); //натравливаем поток на функцию
                thrd.Name = name;  //передаём имя
                thrd.Start(ID);//передача параметра в поток
            }
            void Loker(object ID) //сама функция которая генерит сообщения для сложных устройств
            { 
                  ...
             }
     static void Main()
        {
            Potoc p1 = new Potoc("Potoc 1", 21);  //объявляем, описываем и стартуем поток.
            Potoc p2 = new Potoc("Potoc 2", 22);  // как это сделать не тысячей строк, а в цикле? С параметрами передающимися в функцию не беда справится, а как быт с названием типа "p1" ?
Всем спасибо за внимание!

Решение задачи: «Передача параметров пулу потоков»

textual
Листинг программы
  using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Threading;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace exampleC
{
    public partial class Form1 : Form
    {
        private List<ThreadInfo> thrInf = new List<ThreadInfo>();
        private List<string> names = new List<string>();
        private List<int> lstid = new List<int>();
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Thre(object o)
        {
            ThreadInfo thr = (ThreadInfo)o;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lstid.Count; i++)
            {
                ThreadInfo thr = new ThreadInfo();
                thr.ID = lstid[i];
                thr.name = names[i];
                thr.thread = new Thread(Thre);
                thr.thread.Name = thr.name;
                thr.thread.Start(thr);
            }
        }
 
 
        private class ThreadInfo
        {
            public Thread thread;
            public string name;
            public int ID;
        }
    }
}

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


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

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

15   голосов , оценка 4.267 из 5