Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
abb269
5 / 5 / 2
Регистрация: 29.12.2009
Сообщений: 124
1

DataSet и многопоточность

14.03.2011, 15:04. Просмотров 589. Ответов 0
Метки нет (Все метки)

Здравствуйте,
Прошу совета опытных: как оптимальнее с точки зрения быстродействия организовать обработку данных.
Задача - сохранять приходящие с большой частотой (раз в 50-100 мсек) разнородные данные.
Делаю так. Сокетное соединение принимает данные, потом распределяю их по потокам следующим образом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
// d - структура для передачи данных в потоки
 switch (name)
 {
       case "name1":
       var t1 = new Thread(GetName1);
       t1.Start(d);
       break;
      case "name2":
       var t2 = new Thread(GetName2);
       t1.Start(d);
       break;
...
}
Дальше идет обработка в такой примерно процедуре (запись данных идет в таблицу t1 набора данных ds)
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
        private static void GetName1(object o)
        {
            string[] lines, fields;
            int i = 0;
 
            Schema.t1Row row;
            lines = content.Split('\n');
            foreach (string l in lines)
            {
                i++;
                if (l == "") continue;
                fields = l.TrimEnd('\r').Split('|');
                try
                {
                    long t_no = Convert.ToInt32(fields[0]);
                    row = ds.t1.FindByt_no(t_no);
                    insert = (row == null);
                    if (insert) row = ds.t1.Newt1Row();
                    row.t_no = t_no;
                    if (fields.Length > 1)
                        row.par1 = Convert.ToInt32(fields[1]);
                    if (fields.Length > 2)
                        row.par2 = Convert.ToInt32(fields[2]);
                    
                    // тут идет обработка некого параметра
                    // которая может приводить к старту новой нити
                    if (..............)
                    {
                        //Console.WriteLine("\nNEW THREAD");
                        var tNewThread = new Thread(NewThread1);
                        tNewThread.Start();
                    }
                    
                    if (insert)
                    {
                        ds.t1.Addt1Row(row);
                    }
                }
                catch (Exception e)
                { Console.WriteLine(e.Message); }
            }
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // а вот тут генерится исключение,
            // связанное с многопоточностью
            ds.t1.AcceptChanges();
       }
Исключение такое
System.NullReferenceException не обработано
Message=Ссылка на объект не указывает на экземпляр объекта.
Source=System.Data

Природа появления исключения вроде понятна: обработка большого пакета (i-счетчик пакетов) не успевает завершиться до старта следующей нити GetName1. Но как это эффективно (с точки зрения быстродействия) победить?
Или может кто посоветует какие-то иные быстрые схемы обработки.
Буду признателен за любые советы знатоков.
Спасибо.

Добавлено через 40 минут
А еще вот такое бывает исключение.
System.ArgumentException не обработано
Message=Смещение и длина массива за пределами допустимых границ или количество больше числа элементов от указателя до конца исходной коллекции.
Source=System.Data
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2011, 15:04
Ответы с готовыми решениями:

Многопоточность
Есть массив, заполненный случайными числами, на 500 элементов.Есть textBox1 и...

Многопоточность
Как сделать много поточность? т.е. 1 поток отвечает за отправку запроса на...

многопоточность
Привет подскажите возможно ли отслеживать проникновение посторонних программ...

Многопоточность и ЦП
Вызвал метод в контексте 2х вторичных потоков(основной поток + 2 вторичных) и...

Многопоточность
Собсно захотел,что бы пакет отправлялся с разных прокси в разных потоках....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2011, 15:04

Многопоточность
Подскажите очень срочно нужно - сделать многопоточное приложение, в котором...

Многопоточность
В программе создается поток по обработке данных, его работа занимает приличное...

Многопоточность с использованией С# 5
Пытаюсь разобраться, пишу такой код: окошко: <Window...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru