在 C# 中实现锁定的设计模式
Design pattern to implement Locking in C#
我的代码类似于:
private string TryOperation(Some parameters)
{
using (var guard = new OperationGuardWithCleanup(params)) // Aquire lock
{
if (guard.TryStartOperation())
{
Operation(otherParams); // Actual operation method
return "Success"
}
else
{
return "false";
}
}
}
我想提供实现可以任意使用的功能 "Operation"。是否有针对此类实用程序的推荐设计模式。
这是一种可以实现它的简单方法,您应该根据自己的目的对其进行测试和强化。您应该考虑您要实现的目标,因为这将同步您流程中的所有操作,这可能不是您想要的。
private string TryOperation(Action operation)
{
using (var guard = new OperationGuardWithCleanup())
{
if (guard.TryStartOperation())
{
operation();
return "Success";
}
else
{
return "false";
}
}
}
public class OperationGuardWithCleanup : IDisposable
{
private bool disposedValue = false;
private static readonly object _operationLock = new object();
public OperationGuardWithCleanup()
{
Monitor.Enter(_operationLock);
}
public bool TryStartOperation()
{
// ?
return true;
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
Monitor.Exit(_operationLock);
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(true);
}
}
如果我理解你的问题,那么使用委托(类似于 C++ 中的函数指针)可能会满足你的需要。
"Action" 类型是代表的不错选择。
private string TryOperation(Some parameters, Action<OtherParamsType> operation)
{
using (var guard = new OperationGuardWithCleanup(params))
{
if (guard.TryStartOperation())
{
operation(otherParams); // Actual operation method
return "Success"
}
else
{
return "false";
}
}
}
我的代码类似于:
private string TryOperation(Some parameters)
{
using (var guard = new OperationGuardWithCleanup(params)) // Aquire lock
{
if (guard.TryStartOperation())
{
Operation(otherParams); // Actual operation method
return "Success"
}
else
{
return "false";
}
}
}
我想提供实现可以任意使用的功能 "Operation"。是否有针对此类实用程序的推荐设计模式。
这是一种可以实现它的简单方法,您应该根据自己的目的对其进行测试和强化。您应该考虑您要实现的目标,因为这将同步您流程中的所有操作,这可能不是您想要的。
private string TryOperation(Action operation)
{
using (var guard = new OperationGuardWithCleanup())
{
if (guard.TryStartOperation())
{
operation();
return "Success";
}
else
{
return "false";
}
}
}
public class OperationGuardWithCleanup : IDisposable
{
private bool disposedValue = false;
private static readonly object _operationLock = new object();
public OperationGuardWithCleanup()
{
Monitor.Enter(_operationLock);
}
public bool TryStartOperation()
{
// ?
return true;
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
Monitor.Exit(_operationLock);
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(true);
}
}
如果我理解你的问题,那么使用委托(类似于 C++ 中的函数指针)可能会满足你的需要。
"Action" 类型是代表的不错选择。
private string TryOperation(Some parameters, Action<OtherParamsType> operation)
{
using (var guard = new OperationGuardWithCleanup(params))
{
if (guard.TryStartOperation())
{
operation(otherParams); // Actual operation method
return "Success"
}
else
{
return "false";
}
}
}