Многопоточность и обращения к БД.
От: lasTvegas Украина  
Дата: 25.05.11 09:08
Оценка:
При работе серверного приложения возникает нехороший Invalidoperationexception.
Локализировать место вылета не удаётся (возникает только при большой нагрузке и у стороны клиента). Но все обращения к БД находятся в следующем участке кода:

        DBR _dbr = new DBR(); //класс для работы с БД
        static ManualResetEvent _mre = new ManualResetEvent(true);
        public void Transfer(object o)
        {
            //Запрос существующих устройств
            _mre.Reset();
            _emeiList = _dbr.GetIMEIs();
            _mre.Set();
            Connection conn = (Connection)o;
            Socket s = conn._socket;
            byte[] buffer = new byte[17];
            //Получение заголовка пакета устройства
            ...
            //Проверка заголовка на наличие его в нашем списке
            if (_emeiList.IndexOf(avlfp._imeiASCII) == -1)
            {
                //Отменяем получение
                ...
            }
            _dbr.UpdateDate(avlfp._imeiASCII, true);
            //Проверка заголовка на необходимость обрабатывать данные с устройства
            if (!_dbr.IsConnect(avlfp._imeiASCII))
            {
                //Отменяем получение
                ...
            }
            //Принимаем данные
            ...
            //Сохраняем запись
            _mre.Reset();
            _dbr.SaveResult(avlPacket);
            _mre.Set();
            //Подтверждаем приём данных   
            ...
            }
        }

Понимаю, что проблема возникает при одновременном запуске нескольких функций Transfer. Подскажите как найти место вылета исключения?
Re: Многопоточность и обращения к БД.
От: _FRED_ Черногория
Дата: 25.05.11 10:35
Оценка:
Здравствуйте, lasTvegas, Вы писали:

T>…Подскажите как найти место вылета исключения?


Скомпилировать в дебаге со включёнными символами (pdb) и нагрузить? Тогда, при вылете в Exception::ToString() будет номер строки. Если залогировать, то позже можно будет посмотреть.
Help will always be given at Hogwarts to those who ask for it.
Re: Многопоточность и обращения к БД.
От: Neco  
Дата: 25.05.11 10:38
Оценка:
Здравствуйте, lasTvegas, Вы писали:

T>Понимаю, что проблема возникает при одновременном запуске нескольких функций Transfer. Подскажите как найти место вылета исключения?

пробовали отдать им бинарники с pdb файлами и потом в логах (или где-нить на фейсе) посмотреть строчку?
всю ночь не ем, весь день не сплю — устаю
Re[2]: Многопоточность и обращения к БД.
От: lasTvegas Украина  
Дата: 25.05.11 14:41
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, lasTvegas, Вы писали:


T>>…Подскажите как найти место вылета исключения?


_FR>Скомпилировать в дебаге со включёнными символами (pdb) и нагрузить? Тогда, при вылете в Exception::ToString() будет номер строки. Если залогировать, то позже можно будет посмотреть.


Имеете в виду Написать что-то на подобие такого


Void Transfer(object o)
{
    try{
        //Весь код метода
        ...
    }
    catch(Exeptio e)
    {
         //запись в файл лога
         fs.Write(bytes, 0, bytes.Length);
    }
}
Re[3]: Многопоточность и обращения к БД.
От: _FRED_ Черногория
Дата: 25.05.11 15:39
Оценка:
Здравствуйте, lasTvegas, Вы писали:

T>>>…Подскажите как найти место вылета исключения?

_FR>>Скомпилировать в дебаге со включёнными символами (pdb) и нагрузить? Тогда, при вылете в Exception::ToString() будет номер строки. Если залогировать, то позже можно будет посмотреть.
T>Имеете в виду Написать что-то на подобие такого
T>Void Transfer(object o)
T>{
T>    try{
T>        //Весь код метода
T>        ...
T>    }
T>    catch(Exeptio e)
T>    {
T>         //запись в файл лога
T>         fs.Write(bytes, 0, bytes.Length);
T>    }
T>}


Нет, такого:
T>Void Transfer(object o)
T>{
T>    try{
T>        //Весь код метода
T>        ...
T>    }
T>    catch(Exeptio ex)
T>    {
        MyTraceSource.TraceEvent(TraceEventType.Error, 0, ex.ToString());
T>    }
T>}
Help will always be given at Hogwarts to those who ask for it.
Re: Многопоточность и обращения к БД.
От: Tesh США  
Дата: 26.05.11 07:36
Оценка:
Здравствуйте, lasTvegas, Вы писали:

Для каких целей вы используете ManualResetEvent? DBR потокобезопасен или нет?
Re[2]: Многопоточность и обращения к БД.
От: Аноним  
Дата: 26.05.11 09:54
Оценка:
Здравствуйте, Tesh, Вы писали:

T>Здравствуйте, lasTvegas, Вы писали:


T>Для каких целей вы используете ManualResetEvent? DBR потокобезопасен или нет?


DBR не потокобезопасен. Внутри него подключения к БД и обращения с запросами и сохранение(всё на LINQ).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.