BUG: LinqMetadataProvider.IsLinqObject (unstable)
От: Аноним  
Дата: 18.11.09 05:08
Оценка: 58 (1)
Приветсвую,

В многопотоковом приложении периодически бросается исключение 'InvalidOperationException {"Нулевой объект должен иметь значение."}' в методе 'LinqMetadataProvider.IsLinqObject' на строчке 36:

      return _isLinqObject.Value;


DbManager создается создается в каждом потоке и имеет минимальное время жизни ограниченное выполнением запроса к БД, т.е. использование DbManager из разных потоков отсутствует.

Просмотрев бегло код, вроде как MetadataProviderList является глобальным объектом и если это так, то подобные коллизии должны возникать периодически для всех MetadataProviderBase'ов.

Ниже часть кода из LinqMetadataProvider относящаяся к описанной проблеме:
private void EnsureMapper(Type type)
{
    if (_type != type)
    {
        _type         = type;
        _isLinqObject = null;
    }
}

private bool IsLinqObject(Type type)
{
    EnsureMapper(type);

    if (_isLinqObject == null)
    {
        var attrs = type.GetCustomAttributes(typeof(TableAttribute), true);
        _isLinqObject = attrs.Length > 0;
    }

    return _isLinqObject.Value;
}


Обратите внимание на выделенные строчки. Если вызов 'IsLinqObject' не синхронизован, то вполне вероятна ситуация когда _isLinqObject действительно null.

Предполагаю, что синхронизация на уровне IsLinqObject это частный случай (хотя и работает в моей конкретной ситуации) и возможно имеет смысл рассмотреть более общую проблему использования глобальных объектов в многопоточной среде.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.