C# 处理LINQ并发问题?
我正在编写一个可供多个用户使用的程序,并发性是我非常关心的问题。我写了这个程序,甚至不知道这个主题,现在我正在进行多用户测试,事情开始变得糟糕起来 如果操作失败,我希望能够重新尝试,但不知道如何进行。如果有错误,我的代码会显示一个消息框,但我真正想做的是让它等待一秒钟,然后再次触发按钮。Click()事件 我怎样才能做到这一点C# 处理LINQ并发问题?,c#,linq,C#,Linq,我正在编写一个可供多个用户使用的程序,并发性是我非常关心的问题。我写了这个程序,甚至不知道这个主题,现在我正在进行多用户测试,事情开始变得糟糕起来 如果操作失败,我希望能够重新尝试,但不知道如何进行。如果有错误,我的代码会显示一个消息框,但我真正想做的是让它等待一秒钟,然后再次触发按钮。Click()事件 我怎样才能做到这一点 Button.Click() { var Result = from a in DB.Table where a.Id == 1
Button.Click()
{
var Result =
from a in DB.Table
where a.Id == 1
select new {Row = a}.Single();
Result.Row.Value = "hulkSMASH!!!";
try
{
DB.SubmitChanges();
}
catch
{
MessageBox.Show("Action failed");
}
}
没有内置的“LINQ方式”来执行重试,如果这是您所要求的
我们一直在使用LINQ,不会遇到您所描述的并发问题。这是因为我们在数据库中的表、视图、索引和事务的设计上投入了大量的时间和精力。在我看来,与其在超时或死锁时尝试重试,不如将精力集中在解决这些超时和死锁上
我建议您首先对数据库运行SQL Server Profiler跟踪,并查看正在运行的查询类型。如果您看到一个OLTP类型的查询需要超过(比如)100毫秒的时间,您可能应该调查并理解这是为什么。验证索引是否正确。了解查询及其生成的计划。让您的查询运行良好,您就不必担心99.999%的时间会重试。您应该阅读:
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
//No database values are merged into current.
occ.Resolve(RefreshMode.KeepCurrentValues);
}
}
查看其他链接,了解更多选项,例如保留数据库值或合并它们。我很困惑。即使我的查询执行得很好,如果一个操作试图更新一个条目,但在第一个操作能够提交更改之前,该条目被另一个操作修改了,难道就不会有问题吗?这些示例对于像我这样的noob来说足够简单。我现在正在使用这个解决方案,希望它能使我的代码更易于管理。