Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理LINQ并发问题?_C#_Linq - Fatal编程技术网

C# 处理LINQ并发问题?

C# 处理LINQ并发问题?,c#,linq,C#,Linq,我正在编写一个可供多个用户使用的程序,并发性是我非常关心的问题。我写了这个程序,甚至不知道这个主题,现在我正在进行多用户测试,事情开始变得糟糕起来 如果操作失败,我希望能够重新尝试,但不知道如何进行。如果有错误,我的代码会显示一个消息框,但我真正想做的是让它等待一秒钟,然后再次触发按钮。Click()事件 我怎样才能做到这一点 Button.Click() { var Result = from a in DB.Table where a.Id == 1

我正在编写一个可供多个用户使用的程序,并发性是我非常关心的问题。我写了这个程序,甚至不知道这个主题,现在我正在进行多用户测试,事情开始变得糟糕起来

如果操作失败,我希望能够重新尝试,但不知道如何进行。如果有错误,我的代码会显示一个消息框,但我真正想做的是让它等待一秒钟,然后再次触发按钮。Click()事件

我怎样才能做到这一点

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来说足够简单。我现在正在使用这个解决方案,希望它能使我的代码更易于管理。