【发布时间】:2012-03-17 08:42:01
【问题描述】:
我正在尝试更多地了解设计模式,并且我正在构建一个快速测试来帮助我进一步了解单例模式。然而,我在 .net 中遇到了一个让我感到困惑的错误,更奇怪的是我无法复制这个让我更加困惑的错误。下面的代码不是世界上最好的代码,但我随机测试了一些东西以帮助我更深入地理解。
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(run1));
Thread t2 = new Thread(new ThreadStart(run2));
t1.Priority = ThreadPriority.Lowest;
t1.Start();
t2.Priority = ThreadPriority.Lowest;
t2.Start();
Console.ReadLine();
}
public static void run1()
{
Console.WriteLine("im in run1 \n");
TestSingleton._instance.PopulateCrudItemsProcess();
Thread.Sleep(1000);
Console.WriteLine(TestSingleton._instance.GetStrValue("first", 1000));
}
public static void run2()
{
Console.WriteLine("im in run2 \n");
TestSingleton._instance.PopulateCrudItemsProcess();
Console.WriteLine(TestSingleton._instance.GetStrValue("second", 500));
}
}
sealed class TestSingleton
{
private TestSingleton() { }
public static readonly TestSingleton _instance = new TestSingleton();
public string GetStrValue(string str, int time)
{
return str;
}
public void PopulateCrudItemsProcess()
{
const string proc = "[testdb].[dbo].[tstsproc]";
string _reportingConnStr = ConfigurationManager.ConnectionStrings["reporting"].ConnectionString;
using (SqlConnection conn = new SqlConnection(_reportingConnStr))
{
using (SqlCommand cmd = new SqlCommand(proc, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 7200;
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
}
现在发生的事情是程序在 cmd.ExecuteNonQuery(); 上崩溃了;并表示资源出现死锁。我希望我能捕捉到实际的错误,但就像我说的那样,我只能得到一次错误。根据 MS,此代码是创建单例的线程安全方式。那么对可能导致错误的原因有什么想法吗?非常感谢任何信息。
【问题讨论】:
-
此错误可能来自数据库。你的 ExecuteNonQuery 在做什么?
标签: c# .net design-patterns singleton