Кажется, проблема в том, что с интервалом обновления, скажем, 1 секунда, когда пользователь прокручивает или пытается получить доступ к полям данных, данные постоянно удаляются и читаются.Это приводит к тому, что привязка для вызова try вызывает значение, которое, по ее мнению, все еще может быть, но это не так, и именно поэтому вы получаете индекс вне диапазона исключений
Первое, что я бы предложил сделать, этов вашем методе updateJobs, а также во всех других списках, которые обновляются как список очередей, вместо того, чтобы каждый раз очищать список, сначала проверяется, существует ли задание из xml в текущем списке заданий, и если да, то вы можете изменитьтекущие значения, если значение изменилось, иначе ничего не делают.
Чтобы проверить, существует ли задание, это так же просто, как:
t_job = _jobs.FirstOrDefault(c => c.Filename == t_filename);
Это вернет ноль, если задание не существуетЯ бы предположил, что имя файла может быть не уникальным, поэтому может потребоваться изменить его так, чтобы оно действительно было уникальным, то есть
t_job = _jobs.FirstOrDefault(c => c.Filename == t_filename && c.nzo_id == t_nzo_id);
Одна вещь, которую вам теперь придется обслуживать, заключается в том, что старые задания не будут автоматическиудаляется, поэтому при каждом добавлении нового задания истории сначала проверьте, существует ли оно в очереди, а затем удалите его, прежде чем добавлять всписок истории.
поэтому измените ваши свойства на:
public int Index
{
get { return _index; }
set
{
if (_index != value)
_index = value;
}
}
вместо:
public int Index { get { return _index; } set { _index = value; } }
Другое дело, что попытка перехвата исключений обходится дорого, поэтомувместо:
try { i_percentage = double.Parse(t_percentage); } catch { }
потому что вы знаете, что если есть значение, оно будет двойным, вы можете изменить его на:
if (!string.IsNullOrEmpty(t_percentage))
i_percentage = double.Parse(t_percentage);
сейчас, если вы неЧтобы знать, будет ли значение в t_percentage двойным, вы можете использовать try-parse:
if (!string.IsNullOrEmpty(t_percentage))
double.TryParse(t_percentage,out i_percentage);
Таким образом вы избежите накладных расходов, вызванных исключением.Это может быть микрооптимизацией и не всегда необходимо, если на самом деле это не вызывает проблемы, но, учитывая, что у вас может быть сотни заданий, каждое из которых имеет 10 или около того свойств, обновляющихся каждую секунду, на самом деле все может стать заметно медленнее, если даже 2 из10 свойств создает исключение.
Еще одна вещь, после того, как ваш фоновый работник завершил, в методе: dgvQueue_Update()
вы вызываете ResetBindings(true);
, это заставляет обновлять всю вашу сетку данных, а не только отдельные элементы.
попробуйте изменить его на:
for (int i = 0; i < jobSource.List.Count; i++)
jobSource.ResetItem(i);
Разница в следующем:
this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, itemIndex));
по сравнению с тем, когда вы говорите ResetBindings:
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));