Как устранить ошибку, связанную с изменением коллекции, когда кажется, что многопоточность вовлечена или причина? - PullRequest
0 голосов
/ 29 февраля 2012

Этот сценарий включает в себя: ASP.NET, Visual Studio 2010, SQL Server 2008 R0 и SubSonic 3.0.0.2

Я выделил эту ошибку в ситуации, когда коллекция не изменяется каким-либо видимым способом (без добавления / удаления элементов коллекции, без сортировки и т. Д.). Итак, я понимаю, что это какая-то проблема с многопоточностью, верно?

Ошибка возникает в SubSonic.DataProviders.DbDataProvider, в FindTable методе DbDataProvider.cs . Мой метод для воспроизведения ошибки в основном вызывает этот метод несколько раз в быстрой последовательности от уровня пользовательского интерфейса. Не изящно, но это лучшее, что у меня есть, поскольку ошибка периодически возникает у моих пользователей на производстве.

Вот полный исходный код для DbDataProvider.cs: https://github.com/subsonic/SubSonic-3.0/blob/master/SubSonic.Core/DataProviders/DbDataProvider.cs

В методе FindTable возникает ошибка:

public ITable FindTable(string tableName)
{
    // The following line throws the error.
    var result = Schema.Tables.FirstOrDefault(x => x.Name.Equals(tableName, StringComparison.InvariantCultureIgnoreCase)) ?? 
                 Schema.Tables.FirstOrDefault(x => x.ClassName.Equals(tableName, StringComparison.InvariantCultureIgnoreCase));

    return result;
}  

Вот StackTrace:

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at SubSonic.DataProviders.DbDataProvider.FindTable(String tableName) in D:\TFS\SubSonic.Core\DataProviders\DbDataProvider.cs:line 345
at MyCorp.DataAccessLayer.SomeDb.FindTable(String tableName)
at SubSonic.Repository.SubSonicRepository`1.GetTable() in D:\TFS\SubSonic.Core\Repository\SubSonicRepository.cs:line 42
at MyCorp.DataAccessLayer.grid_type_obj.Init()
at MyCorp.DataAccessLayer.grid_type_obj..ctor()
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)

Есть идеи, что могло бы вызвать это и как это можно решить? Я попытался ввести блокировку, но, похоже, это сильно ударило по производительности.

В предыдущем выпуске, который использовал SubSonic 2.2, все работало нормально. После перехода на SubSonic 3.x мы не обнаружили никаких проблем в средах DEV, TEST или UAT. Это стало проблемой только после того, как мы пошли на производство. Кажется, это также не связано с нагрузкой, поскольку я могу воспроизвести ошибку для нашей производственной базы данных из локальной среды разработки приложений без других активных подключений пользователей к базе данных.

1 Ответ

0 голосов
/ 29 февраля 2012

Я ничего не знаю о SubSonic, но это может помочь перетащить Schema.Tables в переменную, которая вызывает выполнение (например, Schema.Tables.ToArray ()) для двойного прохода строки с ошибкой.

...