Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
1

Создать пул потоков

20.10.2017, 16:32. Показов 2083. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день.
Есть код рабочий, для логирования изменений параметров/связей. Следующий код срабатывает каждый раз по событию сохранения объекта.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
 
namespace ConsoleAppUseMuse
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(Process);
            thread.Start();
 
            Console.ReadKey();
 
        }
        static void Process()
        {
            object obj = null;
            List<Parameters> methods = new List<Parameters>();
            methods.Add(new Parameters(obj, "Parameter name", false));
            methods.Add(new Parameters(obj, "Parameter amount", false));
            methods.Add(new Parameters(obj, "Parameters date", true));
 
 
            List<Links> methods2 = new List<Links>();
            methods2.Add(new Links(obj, "Link 0", false));
            methods2.Add(new Links(obj, "Link 1", false));
            methods2.Add(new Links(obj, "Link 2", false));
            methods2.Add(new Links(obj, "Links 3", true));
 
 
            methods.AsParallel().ForAll(x => CheckChange(x.Obj, x.Str, x.Flag));
            methods2.AsParallel().ForAll(x => CheckChange(x.Obj, x.Str, x.Flag));
 
        }
 
        static void CheckChange(object obj, string str, bool flag)
        {
            for (int i = 0; i < 10; i++)
            {
                if (flag)
                {
                    SaveToLog(obj, str, flag);
                    break;
                }
 
            }
        }
 
        static void SaveToLog(object obj, string str, bool flag)
        {
            Console.WriteLine(str);
        }
        class Parameters
        {
            public object Obj { get; private set; }
            public string Str { get; private set; }
            public bool Flag { get; private set; }
 
            public Parameters(object obj, string str, bool flag)
            {
                this.Obj = obj;
                this.Str = str;
                this.Flag = flag;
            }
        }
        class Links
        {
            public object Obj { get; private set; }
            public string Str { get; private set; }
            public bool Flag { get; private set; }
 
            public Links(object obj, string str, bool flag)
            {
                this.Obj = obj;
                this.Str = str;
                this.Flag = flag;
            }
        }
    }
}
Часто получаю ошибки по взаимоблокировки (по созданию / обновлению объектов), когда происходят одновременные запросы, если все запросы происходят на одном клиенте.

Помогите сделать статическую очередь на сохранение

Набросал , как это могло бы выглядеть,но мне не совсем понятно как это применить к моему логу .

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  public static class Worker
    {
        private static System.Collections.Concurrent.ConcurrentQueue<string> _queue;
 
        public static void SaveToLog(string someData)
        {
            if (_queue == null)
            {
                _queue = new System.Collections.Concurrent.ConcurrentQueue<string>();
                System.Threading.ThreadPool.QueueUserWorkItem(DoWork);
            }
 
            _queue.Enqueue(someData);
        }
 
        private static void DoWork(object state)
        {
            while (true)
            {
                string workItem;
                if (_queue.TryDequeue(out workItem))
                {
                    //save workItem
                }
            }
        }
    }

Не по теме:

Rius, перенёс тему ранее начатую "Методы сообщенные в потоки - C#" сюда

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2017, 16:32
Ответы с готовыми решениями:

Правильно создать пул потоков, запустить эти потоки одновременно и дождаться их завершения
Добрый день! Подскажите пожалуйста, как правильно создать пул потоков, запустить эти потоки...

Пул потоков
Здравствуйте. Допустим, у нас есть массив из 1000 элементов и n потоков, которые должны обработать...

Создание в background_worker пул потоков
Всем привет!!! столкнулся с проблемой не могу решить, вот допустим мы считываем все текстовые...

Создание потоков через пул
Здравствуйте, подскажите пожалуйста вот такое задание для создания потоков используйте пул вот...

4
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,659
Записей в блоге: 14
20.10.2017, 16:44 2
UseMuse, так я же говорил, что объект у вас передаётся в поток один и тот же.
Тут и одновременный доступ со взаимоблокировкой возможен, и пропуск изменений.
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
20.10.2017, 16:46  [ТС] 3
Rius, если очередь на сохранение не поможет, буду искать другой способ
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,659
Записей в блоге: 14
20.10.2017, 16:47 4
Проблемы зависят от природы отслеживаемого объекта.
Я вам там предложил другой способ - получение изменённых данных и передача их в поток.
1
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
20.10.2017, 16:48  [ТС] 5
Цитата Сообщение от UseMuse Посмотреть сообщение
methods2.AsParallel().ForAll(x => CheckChange(x.Obj, x.Str, x.Flag))
Это нужно заменить на это
C#
1
methods2.AsParallel().ForAll(x => CheckChangeLinks(x.Obj, x.Str, x.Flag))
+ дописать еще один метод, так как методы для проверки на изменения параметров и связей разные.


C#
1
2
3
4
5
6
7
8
9
10
11
12
static void CheckChangeLinks(object obj, string str, bool flag)
        {
            for (int i = 0; i < 10; i++)
            {
                if (flag)
                {
                    SaveToLog(obj, str, flag);
                    break;
                }
 
            }
        }
0
20.10.2017, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2017, 16:48
Помогаю со студенческими работами здесь

Создаются не все потоки (пул потоков)
Создаю потоки: for (int i = 0; i &lt; Convert.ToInt32(countPool.Text); i++) { ...

Многопоточность, Пул потоков: Запускаются следующие потоки не дождавшись предыдущих
Читаю из файла по строкам некий параметр для передачи в функцию, задаю кол-во потоков, запускаю...

Пул потоков и потоки одновременно
Мне интересно безопасно ли использовать пул потоков и обыкновенные потоки одновременно? Например,...

Пул потоков и обработка запросов на сервере
Прифет :3 Такой вопрос. Припустим у нас есть недосервер, который изначально принимает подключения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru