У меня возникла небольшая проблема с разработанной мной службой Windows. Кажется, у меня конфликт с БД при использовании linq. Я думаю, что понимаю причину проблемы, но хотел бы получить совет по ее устранению.
У меня есть база данных с таблицей, в которой хранятся сообщения, которые необходимо отправлять каждые несколько раз из службы. Вот мой фрагмент кода.
protected override void OnStart(string[] args)
{
timer = new Timer(10000);
timer.Elapsed += new ElapsedEventHandler(TimeElapsed);
timer.Interval = 10000;
timer.Start();
EventLogger.LogEvent("Timer started succesfuly", EventLogEntryType.Information);
}
protected override void OnStop()
{
if (timer != null)
timer.Stop();
EventLogger.LogEvent("Timer stopped.", EventLogEntryType.Information);
}
private void TimeElapsed(object source, ElapsedEventArgs e)
{
try
{
EventLogger.LogEvent("Checking for reversals", EventLogEntryType.Information);
//We now need to check for reversals that are waiting to be sent
ReversalsDataContext db = new ReversalsDataContext();
var reversals = db.FiReversals.Where(r => r.Status == Reversal.ReversalStatus.WAITING_TO_SEND);
if (reversals.Any())
{
EventLogger.LogEvent(reversals.Count() + " reversals found and being processed.", EventLogEntryType.Information);
//Mark the reversal
foreach (var rev in reversals)
{
MarkReversal(rev);
}
db.SubmitChanges();
//We now need to send the reversal
foreach (var rev in reversals)
{
SendReversal(rev);
}
db.SubmitChanges();
EventLogger.LogEvent("Finished processing reversal queue", EventLogEntryType.Information);
}
}
catch (Exception ex)
{
EventLogger.LogEvent(ex.Message + "\n" + ex.StackTrace, EventLogEntryType.Error);
}
}
Ошибка, которую я получаю сейчас:
Строка не найдена или не изменена.
в System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode faultMode)
в System.Data.Linq.DataContext.SubmitChanges (ConflictMode faultMode)
в System.Data.Linq.DataContext.SubmitChanges ()
at EftcObReversalService.EftcObReversalService.TimeElapsed (Источник объекта, ElapsedEventArgs e)
Из того, что я вижу, это вызвано следующим кодом,
if (reversals.Any())
{
EventLogger.LogEvent(reversals.Count() + " reversals found and being processed.", EventLogEntryType.Information);
//Mark the reversal
foreach (var rev in reversals)
{
MarkReversal(rev);
}
db.SubmitChanges();
//We now need to send the reversal
foreach (var rev in reversals)
{
SendReversal(rev);
}
db.SubmitChanges();
EventLogger.LogEvent("Finished processing reversal queue", EventLogEntryType.Information);
}
Что происходит здесь, я читаю из таблицы то, что помечено как «WAITING_TO_SEND», как только я получаю, я решаю пометить записи статусом «ОЖИДАНИЕ». Я делаю это, так как не хочу, чтобы записи снова читались, когда таймер переключается, а эта тема еще не завершена.
После того, как я отметил все входы, я обрабатываю каждый из них в методе SendReversal, где я также отмечаю статус как «ЗАВЕРШЕНО», когда он был завершен, или меняю статус обратно на «WAITING_TO_SEND».
Я думаю, что эта ошибка вызвана 2 db.SubmitChanges, так как запись изменилась и была записана первой отправкой и отличается от второй отправки?
Если у кого-то есть мысли или решения, пожалуйста, дайте мне знать.