Что касается безопасности нитей в вашей ситуации, вы должны сделать выбор между:
- Создание синглтона
- Выполнение методов в единственном экземпляре
- Выполнение хранимых процедур
Первая часть, которую вы получили скрытно, статический конструктор вызывается только один раз в нескольких потоках, и поэтому весь код инициализации для статических переменных также выполняется только один раз. Это подразумевается, хотя и в духе упрощения понимания, вы должны использовать более явный подход, также выполняющий инициализацию в методе get instance, который является более распространенным, см. Ниже. Однако он облегчает чтение вашего кода для других, и в этом отношении он уже работает.
Вторая часть сама по себе является поточно-ориентированной, поскольку вы не делитесь какими-либо ресурсами, как уже указывал JonSkeet.
Однако третья часть, похоже, является проблемой, как уже указывали другие. Одновременное выполнение StoredProcedures или любого другого SQL-запроса может привести к взаимоблокировке на уровне БД. В вашем случае это очень вероятно, что вы видите ошибку.
Украсть заглушку из KarlLynch и сделать создание экземпляра явным образом безопасным:
public class MySingleton
{
private static MySingleton Instance{ get; set; }
private static readonly object initLock;
// Private constructor
private MySingleton()
{
initLock = new object();
}
public static MySingleton GetInstance()
{
if (Instance == null)
{
lock(initLock)
{
if (Instance == null)
{
Instance = new MySingleton();
}
}
}
return Instance;
}
}