
























在数据操作中经常需要锁一个对象来达到数据同步的目的;在一个应用程序中锁对象比较方便,因为c#提供了线程锁对象功能,但如果是不同服务器的数据操作需要锁对象就必须做一个对象锁服务了。
制定功能方法:
代码
public class ObjectEnter:IDisposable
{
private string mOwnerID;
static ObjectEnter()
{
Core.Functions.Action(CheckExpires);
}
public ObjectEnter(string id)
{
mOwnerID = Guid.NewGuid().ToString("N");
mID = id;
Enter(mOwnerID, id, 60000);
}
public ObjectEnter(string id, int milliseconds)
{
mOwnerID = Guid.NewGuid().ToString("N");
mID = id;
Enter(mOwnerID, id, milliseconds);
}
private string mID = null;
private static Dictionary<string, LockItem> mObjectTable = new Dictionary<string, LockItem>(100);
public static void TryEnter(string id, Smark.Core.AsyncDelegate<string,bool> lockhandler)
{
TryEnter(id, 60000, 30000, lockhandler);
}
public static void TryEnter(string id, int milliseconds, int timeout, Smark.Core.AsyncDelegate<string,bool> lockhandler)
{
string owner = Guid.NewGuid().ToString("N");
if(lockhandler!=null)
lockhandler(owner,TryEnter(owner, id, milliseconds, timeout));
}
public static bool TryEnter(string owner, string id, int milliseconds, int timeout)
{
QueueState state = new QueueState();
state.EntrerMilliseconds = milliseconds;
state.TimeOut = timeout;
if (!GetLockItem(id).Enter(owner, milliseconds, state))
{
state.Handler.Reset();
state.Handler.WaitOne(state.TimeOut);
return GetLockItem(id).Enter(owner, milliseconds, null);
}
else
{
return true;
}
}
public static void Enter(string owner,string id, int milliseconds)}
private static void CheckExpires()实现相关锁的WEB服务
代码
/// <summary>
/// 对象锁服务
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class ObjectEnterService : System.Web.Services.WebService
{
[WebMethod]
public string TryEnter(string id, int seconds, int timeout)服务比较简单如果能锁住对象就返回一个拥有者的ID,释放的时候需要转入这个拥有者的ID和锁标识.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。