C# SqlException-带锁的死锁

C# SqlException-带锁的死锁,c#,sql-server,sql-server-2008-r2,C#,Sql Server,Sql Server 2008 R2,获取以下代码中的错误: SqlException:事务进程ID 80在另一个进程的锁资源上被死锁,并被选为死锁受害者。重新运行事务 其他代码: public static void Start() => new Action[] { CleanAbc }.ToList().ForEach(clean => new Thread(() => { while (true) { t

获取以下代码中的错误:

SqlException:事务进程ID 80在另一个进程的锁资源上被死锁,并被选为死锁受害者。重新运行事务

其他代码:

    public static void Start() => new Action[]
    {
        CleanAbc
    }.ToList().ForEach(clean => new Thread(() =>
    {
        while (true)
        {
            try
            {
                Thread.Sleep(TimeSpan.FromMinutes(1));                    
                if (IsClean())
                {
                    clean();
                }                
            }
            catch (Exception ex)
            {

            }
        }
    }).Start());

    private static bool IsClean() =>
        TimeSpan.FromHours(5) < DateTime.Now.TimeOfDay
        || DateTime.Now.TimeOfDay < TimeSpan.FromHours(19);

有关于如何改进的建议吗?

这是一个队列吗?我认为问题不在于代码,而在于SQL。要么您编写的查询速度非常慢,并被选为死锁受害者,要么您在服务器上运行其他速度较慢的查询;此查询被选为死锁牺牲品。我认为您需要考虑提高查询的性能,而这可能不是您这里的查询。要选择重删除查询作为死锁受害者,必须同时运行资源更密集的查询。最有可能的候选者实际上就是您正在运行的同一个查询。验证在查询与自身并行运行的情况下,或者在以前运行的实例从未取消的情况下,没有造成某种并发性问题。如果必须,请使用探查器确定正在运行的查询。
    public static void Start() => new Action[]
    {
        CleanAbc
    }.ToList().ForEach(clean => new Thread(() =>
    {
        while (true)
        {
            try
            {
                Thread.Sleep(TimeSpan.FromMinutes(1));                    
                if (IsClean())
                {
                    clean();
                }                
            }
            catch (Exception ex)
            {

            }
        }
    }).Start());

    private static bool IsClean() =>
        TimeSpan.FromHours(5) < DateTime.Now.TimeOfDay
        || DateTime.Now.TimeOfDay < TimeSpan.FromHours(19);