Я написал статический класс, который является хранилищем некоторых функций, которые я вызываю из другого класса.Как сделать поток статического метода безопасным?
public static class CommonStructures
{
public struct SendMailParameters
{
public string To { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public string Attachment { get; set; }
}
}
public static class CommonFunctions
{
private static readonly object LockObj = new object();
public static bool SendMail(SendMailParameters sendMailParam)
{
lock (LockObj)
{
try
{
//send mail
return true;
}
catch (Exception ex)
{
//some exception handling
return false;
}
}
}
private static readonly object LockObjCommonFunction2 = new object();
public static int CommonFunction2(int i)
{
lock (LockObjCommonFunction2)
{
int returnValue = 0;
try
{
//send operation
return returnValue;
}
catch (Exception ex)
{
//some exception handling
return returnValue;
}
}
}
}
Вопрос 1: Для моего второго метода CommonFunction2, я использую новый статический замок, т.е. LockObjCommonFunction2 в этом примере, или я могу использовать тот же объект блокировки LockObj, определенный в начале функции.
Вопрос 2: Есть ли что-нибудь, что может привести к проблемам, связанным с потоками, или я могу улучшить код, чтобы быть безопасной нитью.
Quesiton 3: Есть ли какие-либо проблемы при передаче общего класса вместо struct .. в этом примере SendMailParameters (который я использую для обертывания всех параметров, вместо того, чтобы иметь несколько параметров для функции SendMail)?
С уважением, MH
Вы оставили некоторые важные детали, такие как состояние, от которого зависят две функции. Может ли кто-то из них изменить состояние или зависеть от внутреннего состояния класса? –
Создание всех методов потокобезопасности не гарантирует, что все приложение будет потокобезопасным. Http://ericlippert.com/2013/01/31/the-no-lock-deadlock/ – Euphoric
@ Благодарим за использование этой статьи. Пункт Эрика очень хорош. – aiapatag