C# 多线程:等待线程完成,以便重试死锁

C# 多线程:等待线程完成,以便重试死锁,c#,sql,.net,multithreading,forms,C#,Sql,.net,Multithreading,Forms,我有两个线程,我必须让成功的线程等待死锁的线程重试。当前代码仅对第一个循环有效,因为成功的线程将退出 我尝试过使用Thread.Join()但没有成功 如何使“成功”为“真”的线程等待死锁线程完成 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(

我有两个线程,我必须让成功的线程等待死锁的线程重试。当前代码仅对第一个循环有效,因为成功的线程将退出

我尝试过使用Thread.Join()但没有成功

如何使“成功”为“真”的线程等待死锁线程完成

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(new ThreadStart(procedure1));
            Thread thread2 = new Thread(new ThreadStart(procedure2));

            thread1.Start();
            thread2.Start();
        }


        private void procedure1()
        {
            Console.WriteLine("thread 1");
            bool success = false;
            int retryCount = 1;
            while ((retryCount <= 3) && success == false)
            {
                try
                {
                    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection1"].ConnectionString))
                    {
                        SqlCommand cmd = new SqlCommand(ConfigurationManager.AppSettings.Get("execProcedure1"), connection);
                        connection.Open();
                        cmd.ExecuteNonQuery();
                        success = true;
                    }
                }
                catch (SqlException ex)
                {
                    if (ex.Number == 1205)
                    {
                        if (retryCount == 1) Console.WriteLine("Thread 1 deadlocked");
                        Console.WriteLine("Thread 1 deadlock retry number " + retryCount.ToString());
                        retryCount++;
                    }
                    else
                        Console.WriteLine(ex.Message);
                }
            }
        }

        private void procedure2()
        {
            Console.WriteLine("thread 2");
            bool success = false;
            int retryCount = 1;
            while ((retryCount <= 3) && success == false)
            {
                try
                {
                    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection1"].ConnectionString))
                    {
                        SqlCommand cmd = new SqlCommand(ConfigurationManager.AppSettings.Get("execProcedure2"), connection);
                        connection.Open();
                        cmd.ExecuteNonQuery();
                        success = true;
                    }
                }
                catch (SqlException ex)
                {
                    if (ex.Number == 1205)
                    {
                        if (retryCount == 1) Console.WriteLine("Thread 2 deadlocked");
                        Console.WriteLine("Thread 2 deadlock retry number " + retryCount.ToString());
                        retryCount++;
                    }
                    else
                        Console.WriteLine(ex.Message);
                }
            }
        }
    }
如何使“成功”为“真”的线程等待死锁线程完成

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(new ThreadStart(procedure1));
            Thread thread2 = new Thread(new ThreadStart(procedure2));

            thread1.Start();
            thread2.Start();
        }


        private void procedure1()
        {
            Console.WriteLine("thread 1");
            bool success = false;
            int retryCount = 1;
            while ((retryCount <= 3) && success == false)
            {
                try
                {
                    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection1"].ConnectionString))
                    {
                        SqlCommand cmd = new SqlCommand(ConfigurationManager.AppSettings.Get("execProcedure1"), connection);
                        connection.Open();
                        cmd.ExecuteNonQuery();
                        success = true;
                    }
                }
                catch (SqlException ex)
                {
                    if (ex.Number == 1205)
                    {
                        if (retryCount == 1) Console.WriteLine("Thread 1 deadlocked");
                        Console.WriteLine("Thread 1 deadlock retry number " + retryCount.ToString());
                        retryCount++;
                    }
                    else
                        Console.WriteLine(ex.Message);
                }
            }
        }

        private void procedure2()
        {
            Console.WriteLine("thread 2");
            bool success = false;
            int retryCount = 1;
            while ((retryCount <= 3) && success == false)
            {
                try
                {
                    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection1"].ConnectionString))
                    {
                        SqlCommand cmd = new SqlCommand(ConfigurationManager.AppSettings.Get("execProcedure2"), connection);
                        connection.Open();
                        cmd.ExecuteNonQuery();
                        success = true;
                    }
                }
                catch (SqlException ex)
                {
                    if (ex.Number == 1205)
                    {
                        if (retryCount == 1) Console.WriteLine("Thread 2 deadlocked");
                        Console.WriteLine("Thread 2 deadlock retry number " + retryCount.ToString());
                        retryCount++;
                    }
                    else
                        Console.WriteLine(ex.Message);
                }
            }
        }
    }
如果所有线程必须在相似的时间完成并互相等待,请考虑使用
屏障。否则,我建议使用
Join
(见下文)

一组任务通过一系列阶段进行协作,其中组中的每个任务都发出信号,表示它已在给定阶段到达屏障,并隐式等待所有其他任务到达。同一屏障可用于多个阶段

当您使用一个屏障时,它基本上意味着您分配到该屏障中的所有线程都必须到达一个“检查点”,然后才能继续

下面是一个快速的示例,说明了它可能是什么样子:

公共部分类表单1:表单
{
//创建一个带有2个插槽的屏障
私人屏障=新屏障(2);
私人无效程序1()
{
控制台写入线(“线程1”);
布尔成功=假;
int-retryCount=1;

while((retryCount join)是您问题的解决方案。能否添加代码段以显示您是如何使用join的?“我有2个线程,我必须让成功的线程等待死锁的线程重试。”-是吗?@Fildor我也对他们必须互相等待的要求感到困惑。也许还有其他实现没有列出它们必须同步的位置。要求是我必须多次重试死锁线程(代码中有3次),直到它被认为完成('retryCount为'3')).为什么这个要求意味着另一个线程在等待?谢谢!甚至没有想过使用sentinel。。。