OperationsExtensionsExecuteInLockAsync - метод
Асинхронно выполняет действие actionFunc внутри эксклюзивной блокировки.
Никакое другое вычисление не сможет быть выполнено, пока выполняется действие.
При этом создаётся операция c ID lockOperationTypeID с указанным описанием operationDescription.
Возвращает признак того, что блокировка была взята и действие было выполнено.
Значение false возвращается, если блокировку взять не удалось из-за таймаута при ожидании блокировки.
Вторым параметром возвращается идентификатор операции.
При взятии блокировки все операции не обязательно выполняются в одном и том же соединении с базой данных.
Использование нескольких соединений может быть полезно для больших таймаутов,
чтобы не удерживать одно и то же соединение несколько минут.
Чтобы гарантировать выполнение на одном и том же соединении с БД,
вызовите метод внутри блока await using(dbScope.Create()) { ... }.
Пространство имён: Tessa.Platform.OperationsСборка: Tessa (в Tessa.dll) Версия: 3.6.0.22
public static Task<(bool Result, Guid OperationID)> ExecuteInLockAsync(
this IOperationRepository operationRepository,
string operationDescription,
Func<Guid, CancellationToken, Task> actionFunc,
ILogger logger,
int timeoutSeconds,
string timeoutMessage,
Guid lockOperationTypeID,
string lockName = "Lock",
bool leaveOpen = false,
CancellationToken cancellationToken = default
)
<ExtensionAttribute>
Public Shared Function ExecuteInLockAsync (
operationRepository As IOperationRepository,
operationDescription As String,
actionFunc As Func(Of Guid, CancellationToken, Task),
logger As ILogger,
timeoutSeconds As Integer,
timeoutMessage As String,
lockOperationTypeID As Guid,
Optional lockName As String = "Lock",
Optional leaveOpen As Boolean = false,
Optional cancellationToken As CancellationToken = Nothing
) As Task(Of (Result As Boolean, OperationID As Guid))
public:
[ExtensionAttribute]
static Task<ValueTuple<bool, Guid>>^ ExecuteInLockAsync(
IOperationRepository^ operationRepository,
String^ operationDescription,
Func<Guid, CancellationToken, Task^>^ actionFunc,
ILogger^ logger,
int timeoutSeconds,
String^ timeoutMessage,
Guid lockOperationTypeID,
String^ lockName = L"Lock",
bool leaveOpen = false,
CancellationToken cancellationToken = CancellationToken()
)
[<ExtensionAttribute>]
static member ExecuteInLockAsync :
operationRepository : IOperationRepository *
operationDescription : string *
actionFunc : Func<Guid, CancellationToken, Task> *
logger : ILogger *
timeoutSeconds : int *
timeoutMessage : string *
lockOperationTypeID : Guid *
?lockName : string *
?leaveOpen : bool *
?cancellationToken : CancellationToken
(* Defaults:
let _lockName = defaultArg lockName "Lock"
let _leaveOpen = defaultArg leaveOpen false
let _cancellationToken = defaultArg cancellationToken new CancellationToken()
*)
-> Task<ValueTuple<bool, Guid>>
- operationRepository IOperationRepository
- Репозиторий, управляющий операциями. Не равен null.
- operationDescription String
-
Описание созданной операции. Может быть строкой локализации. Может быть равен null.
- actionFunc FuncGuid, CancellationToken, Task
-
Асинхронное действие, выполняемое внутри блокировки. Параметром получает идентификатор операции. Не равно null.
- logger ILogger
-
Объект, выполняющий логирование, или null, если логирование выполняется объектом по умолчанию.
- timeoutSeconds Int32
-
Таймаут взятия блокировки в секундах.
- timeoutMessage String
- Сообщение при невозможности взять блокировку из-за таймаута.
- lockOperationTypeID Guid
- ID типа операции блокировки.
- lockName String (Optional)
- Строка с именем объекта над которым выполняется блокировка. Необходима для понятной запси в логах.
- leaveOpen Boolean (Optional)
- Признак того, что операция, создаваемая для блокировки, не удаляется. Её потребуется удалить вручную.
- cancellationToken CancellationToken (Optional)
- Объект, посредством которого можно отменить асинхронную задачу.
TaskValueTupleBoolean,
Guid
Асинхронная задача, которая возвращает
true, если блокировка успешно взята, действие выполнено, и блокировка освобождена;
false, если блокировку не удалось взять из-за таймаута.
Во всех остальных случаях выбрасывается исключение.
Вторым параметров возвращает идентификатор операции.
В Visual Basic и C# этот метод можно вызывать как метод экземпляра для любого объекта типа
IOperationRepository. При вызове метода для экземпляра следует опускать первый параметр. Дополнительные сведения см. в разделе
Методы расширения (Visual Basic) или
Методы расширения (Руководство по программированию в C#).