Работа с потоками - C# (181843)

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

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

Объясните мне мои ошибки и как их поправить(грузит ЦП и делает невозможным работу с GUI программы - лагает ужасно) Есть некий класс, в котором происходит работа с потоками - выдержку я представлю ниже. Запускается он из основного потока, вызовом метода CreateThread.
        private Thread[] Threads;
        public void CreateThread()
        {
            try
            {
                Threads = new Thread[101];
                for (int i = 0; i < 100; i++)
                {
                    Threads[i] = new Thread(this.Worker);
                    Threads[i].IsBackground = true;
                    Threads[i].Start();
                }
 
            }
            catch (Exception)
            {
            }
        }
 
        public void StopThreads()
        {
            try
            {
                for (int i = 0; i < 100; i++)
                {
                    Threads[i].Abort();
                }
            }
            catch (Exception)
            {
            }
        }
 
        public int AliveThreads()
        {
            try
            {
                int count = 0;
                for (int i = 0; i < 100; i++)
                {
                    if (Threads[i].IsAlive)
                    {
                        count++;
                    }
                }
                return count;
            }
            catch
            {
                return 0;
            }
 
        }
 
        void Worker()
        {
            while (SomeQueue1.Count != 0)
            {
                
                if (SomeQueue1.Count + 1 < AliveThreads() && SomeQueue2.Count+1 < AliveThreads())
                {
                    break;
                }
                string data = SomeQueue1.Dequeue();
                try
                {
                    Check(data);
                }
                catch (Exception)
                {
                  SomeQueue.Enqueue(data);
                }
                if (SomeQueue2.Count != 0)
                {
                    string datae = SomeQueue2.Dequeue();
                    try
                    {
                            Check2(datae);
                    }
                    catch (Exception)
                    {
                        SomeQueue2.Enqueue(datae);
                    }
                }
            }
Возможно, моя ошибка в методе обновления GUI. Как вы понимаете,после выполнения Check и Check2 появляются какие-то новые данные, которые я вношу в GUI через таймер, который запускается в самом начале с интервалом в 1000 мс(не из потока же его обноволять, ну). Но что-то я сомневаюсь, что моя проблема в таймере. Скорее всего, я просто неправильно работаю с потоками.

Решение задачи: «Работа с потоками»

textual
Листинг программы
private object ObjLock = new object();
 
void SendMsg(object data)
{
  lock(ObjLock)
  {
      // Тут код отправки сообщения
   }
}
 
 
void Send (datas)
{
    foreach(it in datas)
    {
       ThreadPool.QueueUserWorkItem(SendMsg, (object)it.dataSend);
    }
}

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


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

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

14   голосов , оценка 4.071 из 5
Похожие ответы