exH*_*ash 0 .net c# singleton design-patterns
我正在尝试更多地设计模式,我正在构建一个快速测试,以帮助我进一步了解单例模式.然而,我在.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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在发生的事情是程序在cmd.ExecuteNonQuery()上崩溃了; 并表示资源存在僵局.我希望我能抓住实际的错误,但就像我说我只能得到错误一次.根据MS,这段代码是一种创建单例的线程安全方法.那么对可能导致错误的原因有什么看法?任何信息都非常感谢.
对不起,但是Singleton不是关于线程安全的.它只有一个对象的实例.
因此PopulateCrudItemsProcess,GetStrValue并非线程安全...