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

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

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

Объясните мне мои ошибки и как их поправить(грузит ЦП и делает невозможным работу с GUI программы - лагает ужасно) Есть некий класс, в котором происходит работа с потоками - выдержку я представлю ниже. Запускается он из основного потока, вызовом метода CreateThread.
Листинг программы
  1. private Thread[] Threads;
  2. public void CreateThread()
  3. {
  4. try
  5. {
  6. Threads = new Thread[101];
  7. for (int i = 0; i < 100; i++)
  8. {
  9. Threads[i] = new Thread(this.Worker);
  10. Threads[i].IsBackground = true;
  11. Threads[i].Start();
  12. }
  13. }
  14. catch (Exception)
  15. {
  16. }
  17. }
  18. public void StopThreads()
  19. {
  20. try
  21. {
  22. for (int i = 0; i < 100; i++)
  23. {
  24. Threads[i].Abort();
  25. }
  26. }
  27. catch (Exception)
  28. {
  29. }
  30. }
  31. public int AliveThreads()
  32. {
  33. try
  34. {
  35. int count = 0;
  36. for (int i = 0; i < 100; i++)
  37. {
  38. if (Threads[i].IsAlive)
  39. {
  40. count++;
  41. }
  42. }
  43. return count;
  44. }
  45. catch
  46. {
  47. return 0;
  48. }
  49. }
  50. void Worker()
  51. {
  52. while (SomeQueue1.Count != 0)
  53. {
  54. if (SomeQueue1.Count + 1 < AliveThreads() && SomeQueue2.Count+1 < AliveThreads())
  55. {
  56. break;
  57. }
  58. string data = SomeQueue1.Dequeue();
  59. try
  60. {
  61. Check(data);
  62. }
  63. catch (Exception)
  64. {
  65. SomeQueue.Enqueue(data);
  66. }
  67. if (SomeQueue2.Count != 0)
  68. {
  69. string datae = SomeQueue2.Dequeue();
  70. try
  71. {
  72. Check2(datae);
  73. }
  74. catch (Exception)
  75. {
  76. SomeQueue2.Enqueue(datae);
  77. }
  78. }
  79. }
Возможно, моя ошибка в методе обновления GUI. Как вы понимаете,после выполнения Check и Check2 появляются какие-то новые данные, которые я вношу в GUI через таймер, который запускается в самом начале с интервалом в 1000 мс(не из потока же его обноволять, ну). Но что-то я сомневаюсь, что моя проблема в таймере. Скорее всего, я просто неправильно работаю с потоками.

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

textual
Листинг программы
  1. private object ObjLock = new object();
  2.  
  3. void SendMsg(object data)
  4. {
  5.   lock(ObjLock)
  6.   {
  7.       // Тут код отправки сообщения
  8.    }
  9. }
  10.  
  11.  
  12. void Send (datas)
  13. {
  14.     foreach(it in datas)
  15.     {
  16.        ThreadPool.QueueUserWorkItem(SendMsg, (object)it.dataSend);
  17.     }
  18. }

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


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

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

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы