gpt4 book ai didi

c# - 使用linq的c#windows服务中的问题

转载 作者:行者123 更新时间:2023-11-30 22:42:39 26 4
gpt4 key购买 nike

我在我开发的 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 failureMode) 在 System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 在 System.Data.Linq.DataContext.SubmitChanges() 在 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”的内容,一旦我决定将条目标记为“PENDING”状态。我这样做是因为我不希望在计时器摆动结束并且该线程尚未完成时再次读入条目。

一旦我标记了所有的整体,我就在 SendReversal 方法中处理每一个,当它完成时我也将状态标记为“已完成”,或者将状态更改回“WAITING_TO_SEND”。

我认为此错误是由 2 个 db.SubmitChanges 引起的,因为条目已更改并由第一次提交写入并且与第二次提交不同?

如果有人有任何想法或解决方案,请告诉我。

最佳答案

我正要建议最简单的解决方案是重新查询“待定”...但是如果进程要超限,这当然不能真正解决问题。

我可以快速看到几个选项:

  1. 更改逻辑,以便您一次只能运行处理循环的一个实例 - 基本上,如果您已经在处理,则无法开始,因此请跳过或重新安排。
  2. 除了更改状态之外,您还需要添加一个批号,以便您可以在第一次保存后重新查询,但将该查询限制为特定批号的待处理项目 - 我过去曾这样做过并且拥有它如果错误处理足够聪明,能够在出现异常情况后进行整理,则工作得相当好。

关于c# - 使用linq的c#windows服务中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4311946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com