【发布时间】:2021-05-27 15:52:15
【问题描述】:
我有 2 个线程,我必须让成功的线程等待,而死锁的线程重试。当前代码只适用于第一个循环,因为成功的线程退出了。
我尝试使用 Thread.Join() 没有成功。
如何让 'success' 为 'true' 的线程等待死锁线程完成?
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);
}
}
}
}
用于死锁的 SQL 过程:
CREATE OR ALTER PROCEDURE deadlockP1
AS
BEGIN
BEGIN TRAN;
UPDATE Employee SET position = 'handler' WHERE employee_code = 4037;
WAITFOR DELAY '00:00:05';
UPDATE Shop SET shop_name = 'TITANUS' WHERE shop_code = 2019;
COMMIT TRAN;
END
CREATE OR ALTER PROCEDURE deadlockP2
AS
BEGIN
BEGIN TRAN;
UPDATE Shop SET shop_name = 'TITANUS' WHERE shop_code = 2019;
WAITFOR DELAY '00:00:05';
UPDATE Employee SET position = 'manager' WHERE employee_code = 4037;
COMMIT TRAN;
END
【问题讨论】:
-
join 是您问题的解决方案。可以添加您的代码段以显示您是如何使用 join 的吗?
-
“我有 2 个线程,我必须让成功的线程等待,而死锁的一个重试。” - 你呢?
-
@Fildor 我也对他们必须互相等待的要求感到困惑。也许还有其他未列出的实现必须同步
-
要求是我必须多次重试死锁线程(在我的代码中为 3 次),直到它被认为完成('retryCount 为 '3')。
-
为什么这个要求意味着其他线程在等待?
标签: c# sql .net multithreading forms