Мое приложение изменяет определенную таблицу данных из нескольких потоков. Я уже реализовал эксклюзивный механизм блокировки для добавления строк и фиксации в БД (его обрабатывали два разных потока). Теперь поток пользовательского интерфейса (третий) использует эту таблицу для сужения данных с помощью LINQ, а затем привязки результата к элементу управления Chart. Я уже разбил его на самые маленькие команды, чтобы понять, где это происходит.
Код: Выделить всё
var s1 = dataTable.ToList(); //originally it was dataTable.ToEnumerable()
var s2 = s1.Select(LINQ_expr1);
var s3 = s2.Where(LINQ_expr2);
var s4 = s3.OrderBy(LINQ_expr3);
Во всех случаях это происходило при выполнении первой команды. Единственный 100% рабочий вариант, который я могу сейчас придумать, — это включить сюда мой запорный механизм. Я хотел бы избежать этого, так что, может быть, кто-нибудь знает решение здесь? Я предполагаю, что это должно быть что-то, что создает копию этой переменной и устойчиво к этому исключению.
Эта таблица может содержать несколько сотен тысяч строк (она регулярно усекается, но только после анализа), поэтому я прошу альтернативу моему решению по блокировке. Это заблокирует другие потоки, но, с другой стороны, будет стоить дешевле, чем DataTable.Copy().
Подробнее здесь:
https://stackoverflow.com/questions/792 ... -exception