C# 多线程:等待线程完成,以便重试死锁
我有两个线程,我必须让成功的线程等待死锁的线程重试。当前代码仅对第一个循环有效,因为成功的线程将退出 我尝试过使用Thread.Join()但没有成功 如何使“成功”为“真”的线程等待死锁线程完成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(
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。。。